@agoric/spawner 0.6.9-upgrade-21-dev-16519b2.0 → 0.6.9-ymax-v0.2-alpha-dev-a527ef4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundles/bundle-spawn.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAgBFZ0x3AAAMdwAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjEuMCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vYmFzZTY0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vYmFzZTY0LXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTIzMjQyM2I5OWY2MDQxYzNhMGY3M2ZhNTQ3Yzg3MjhhYjdhZDkwN2ZmMTk2YTUwNWE3ZjZlNDA4MjFjZTkxNjEyNzY3MTU0ZDY0MzRjNTI4ODllZGRhODJmMTc1ZGIxYmQ2NzFkZDZlMDk5MWE2YTIwMTFjOTM2MjBjZTViYzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IzZWYxYjBiOTRiNzBkNTUyYTQzYmJkYTFhYzQ2ZmJhYWQ1NjhlZTAyNDgxM2U4ZTVkODIwMjVjMTE2ZDRhMTc5MzM3MTNjYjM0MDI3NTg1OWZiM2JlM2Y1YTM5NzRhZTY1NmVmMWJlYjAxYWEwZWZhMDVlODBiZTVjMDhkMDYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vdHJhbXBvbGluZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0MzQ0NDRiYzhlYzRkZjU0NzRmMjY3NzgwMzA3ZWUxNzY0NTc4MDJkY2I0OTAzMDhmYWU2ZTE2OWM1NGM0MmVlNjIyNjg1NzJkODEzMjkzOTkwYzY4NDhkNWYzNDRkOGU1OTNhNjBlNmZjOWNlMjMxZDY4ZDNlN2FmY2YxNzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwNmZjZTcxZTBjNTJiMDMyNDdmOTU5MWY4NzdmM2U4MDY3ODNiNTMyMzVhYTgxNTZkMTg5NzNiN2Q2ZGQyNTdhMWFlYjRhNzMyMjMwNzc1YjUzZDM1OTA2OTViNzhiNThlNjQxNGIyNTQzMjU2NzY4YWNmM2M5ZWY1MDI5NmJmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGNiM2YxMjAyMjMzNjUxODMwYjhlODBiOWY1ZDE3MzVjZTJlZWNjMjY5NGVhYjNhNGU1MzhhMWQwMmI3MGE0YTFjZDQyYTkzMjdjMGNjYTc4MjhmYjQyYmQzODJiZGYwNTJmOWU2N2M3ZjE4NGQxN2Y5ZDMxNzc3Mzk1MmRhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODBhNTU5ZmU5YzE2YzEwNjg2NGVjZjEyNjYwNmE0ZWQ5YWFjNGRkYmExNjEzYThhNDVhMjQ2ZWEzMWE0YzRkMjljNGU2NmM5ZjkxYzYzNDc5NDM3YzVhZWE1ZDgzZjhmN2I5NzViOTM3MzAzZTI0ZmFmNmRjYzg5ZTc4NzJjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGViODNlMDkxNjMzZTU4NDdkYzc0ZDA2NDBkYTViZGM3YjQxMGRjOTA0NzJkZTA2OWNjZTU5MmFmMWQzM2I3NTY1YTlmNDVmMmMzZWEyZmZiMWUxZDBlODBkODVlNGI3M2I1OGQyOGM2OTQ4MmNiNDg5NWI3MjM3ODJlMGY0YzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzMjQ3NjNjNjhmOGE4Y2EzNjk3NWQ5ZmRkZDgzNTQ2NzA3MTdhOWZmMWY5ODZlMTFhM2EyNjhlN2ViYzYyZjI0MTQxZDc1ZjY0YzkzMWYzMjY5OTcwYzNhNTdkMWZkOWUzMzEwOWFjMjlhM2M2OTRkMmU0Y2FhMWJlMzhkNjg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTYzNjQxYjVhODg0YTAwZWZjZTYxNmExOWYzMmM0YTNhMDcwYTI0YjRkMGM3NWMzNDVmNmQyYmYxZjc3MTY1M2FjOTQyMTYyNDRjMDlmODE4ZWY0MzU0ZjE3NGZkNGQ1MzBkZDcyYmVjYjM1MmVjN2JkMTRlYjAxM2NmZWJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkMDBiNGU0YmI3MTJkNjJhN2MxYmFiZTkxYzQ1MjRmNmFiM2Y0MzBkZWJhODRmYWNlY2ZhYTdlODU1M2RlMDNjMThkNDUwMmI4YTZkNjMzYWViM2U3YzU4ZTgxMWM5YTE2ZTU3MzRlOTQ0YjdkMjBkZWUzMTI2NzJmYTViYzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzZDcwN2ZiYTg3OGQ3NzlhZjAzMzdjOGFiMjllNzAwODY5NzYzMTkzMzZlNjg3M2M1NjQ5MjMyN2NlOWY4MWVjOTI3NzE1YzA0MTAzN2EyY2QwMjY3YjM5ZDBjZGYyNmUxMmIxN2IwODU4NmY3ZTI1ODU3ZjZjZmFjOWRmNmJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNWI4YjJhMGZkMzY4MmFmMTczYmZhYzFmNjBiNGJiY2U0OGRjMGE3MjIxZTc5MGIwMWJlNzhiMzMxMTNmODgyMWFhMDQyNDU0NTkwMmM2YmZhNjVhZWI3ODg4ZTFjNjUyZDA3YWFiMzA2OTU4NTYzMWE5YmRjYjRmYTZiYzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjZDJjZDgyZTc5OWIyYzQ0OWJlNjRjYzc3YTliOTYwMDRlN2ZhNDJhMmRmMzBhMmY2MzdiYzMzNjRmNDJmZDBjYjIzYzE5OTkwMmEzNjliYWExYmZkN2ZjYmQ4ODUwMzY5MzA1YzA4OWU3Y2U5NGZkNjMyM2JhYTg0NGUzODUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDA0NzlkZDZkNDAyMTQwNWFhYjEzMjMyZWU5ZDI5ZjE1NTQzZWJlYTU3MmNkOTgwMTJlYWJkY2MwN2M2MDQ3YWY1Nzk3NzJlODJmYzc2MmE0NWY1ZmY2YzY5MWQ1MWRkOWFkNjcxMGE2NDhkMDc3NjIyOTIzNDRhMmE4ZGEwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGY3ZDJiOGI4YjM0M2E4ZjRiYTdlNzE5NzY3NWNhYzQzZjNkYmE5MDQyMDMzN2U3MDE2MDI2ZDllMjc4ZDNiYzk1M2U5ZTgyOGE5YTczZDZiNGQ4MTQ1YTBmMGE4NmYwYjQ4NWViYjI1MWExYmY3ZWE2N2M5YmFjMzQ1Njg1MGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3NjQxMDk0MzY1OTUzNzVhNmQ2NGE1OWY5NWY3MjZlNWFhZTA4Nzg3Y2FmOWFhNTA1YTEwMWVjNmYzOTY5NGNjM2ZlZWIxODcyZDAzMDQwYTQ2ZjlkOWJhOTE2M2E1OTdlOTBiZjRkZDQwZDE5MTRmMTdmYTU1NTRlN2RkMDI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZkYTRkOWYwOWEyNTdiMzIwNzNlODhiMmIzNzAzNmY4ZTIxMmU1OWUyODJiOTk5NDZjMTkzNTdiODI5ZmFiNThlZDgxN2U2ZDQxNDQyNWU3YjZhNDVhNDI5OGE2M2U1NDdhZThhZDllZGU2NzQ2NDM1MTAxZDA4NTVjZjVkMTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMjEwMjJlNjE0ODFlZDc1YjU1NTM3ODRlODBmNDhjZTJjNWE2OTY2ZmZkMGRhNzNlZGVkOTYyNjQ4OTUzMjc4NWUzN2VhOWE1NGIyNjcwYTliZTM3ZTRkZmMyMTc3YTlhNmIzMGU1NjdlNDMzZmNlZmZiMTUwNjcwZWZjNjJhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OWEzMjNjZWExOGYxOWQ3MGYyOWQ5NGU2NjdkMGMyNzU2ZDU2NmExZjg0NjliNWY2N2MxOGRiYzg1NzM0NDkxODVmNWJmNzhmYWIwNzg2ODNiMzQ5MWRhZWNkNmIzOGUwMDkyNmM1MmM3ZjQ1MGExNzAyNmVjOWE3YzliYjY5ZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQxNTVhYTNkNDE3ZDI4N2M5OWM5ODFkMjM3YjJkYWM0NzNlMTdmZmViYWUyZjNkYWEzMjk5MWJkNjEyNzVhZjBmYWZmMDc5MDdiMzA5ZDgzZDUwYjYzNTIzZmQ5MjcwOWE3YmZlOTFlODg5YmNiYzI3MWFlNWQ4ZTJjY2JlMWZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTA3NzhmMWJlZmVjMDEwMmYwZmFjYjg3NTc3NDU5ZjgzYWJkNjZjNWQxZjkxNjA5YmI5YTMxYzM5MzQ4NGE2YTVjYzNhOTVlMTQyZTU2MjY0MWM2YWNjYTMxMjA3NjRiYTNjZmE2NTNiMjc5NmNlMzRlZDEwZjNiZWQ2NDlmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNmMjVjZmVhMWM0MzdiMzNhMTM0MjczMmNjODZjMThmMDM2MGE5YWRmOTY5YjViYzRjMTgyZmI3ZjM5NzQ5Zjk5NGM1NTEzOWU5ZTU2NTViZWJhOTdiNTQyZGMzNTMzNzUxZGEwNTg2OWUyMWVhMWUxZDA3YTgxMDA3MWViYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjM2FkNzAwZDA2NTRlNmE0ZmYyNzdhZWMyNjExNTFjOTdiOTMwMDNmZDUwMjNjOGIzYTM2ZTUxZDhiOGM1OWVjZTJlOTVlMjQ1NDBhNDQ1OTNiYjY0NGY2YjEzZmFkMGZhNjRmNGI2MmQ2MDZiYzk5MDIyZDRmYzEzMjg5YjI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMDAyZjE3NTczMmQ1NTRhNGYwNzY0YTFkMjUyOThjZmEwOTIzZTQxMWQ4OTI4NDI4OTBkZmM2NGIxOGExMzUyZWE4MmIxZDhlZTc5NmQ5Y2M4ODU1NDlmNDQ3Mzg4YzljYzNhNDlmY2UwNTdhNmIxMDkyNzM2NWM1MDRmMWUxIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjM0MjQwZDFmNzc1MTZjZTAxNTQ3ZmEyYzQyZDc0YjA3NzU5NTVjOGVlNTU3NjRiNDEzYTAwZjU0NTgyYjZiZWQ2MjVkODRkNDUyNjE5NGM5MDY1NzBkOTQ0OTY3NzA0Yzc5OTM5YzkyMTJiNjg5YmMxMWI4ODZjYmUxMmIzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZGVjMWMzMjA2Y2U4ODU4YTkxYWQxZWMwZDk4MzA5MTBhYTA2NTljYmJhNjZiZTdjMGZiODdjNTM4NzA3ZTBjZGJiYWMxMzdmYTY3NjIzMzhlMjBhNWYwODc1M2U5NTk4MzE0NDJkNmUwMjU2YWRhMWYwODdjODBkZDUwOTk0MiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS42LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NjM1MDMxMmYwZTJkYjZhNTAxMzdlNzJlOTY1ZGI4ZjZlMDI1YWMyYTNlOWMwOTEyYjJiMjcwN2MyZjUzYzAzZjlkN2JkNjM5NzgzMzY5M2QyZWU5MzMwYzUwNjI4ZWM4NDIxYzBjNzlkN2U2ODBjNGNmNWNmNjlhMDYyNDdjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhN2M4OWU1ODQzZTEwMWVmOThkMDgxOWI1MWFlYzFjNDI0ZTFkMWViNGE0MjBlNDg0NDAyNjllMDc1OGVkMzlhOGM1NTdmNGZjOTM5NGI5MWY2MDU2MTNlNmE0NTk2YzU1MmMxODM4YmUxNGZkMzBiNWJkOGExNjk4ZTg1MTU1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI0ZmJmMWRlOWRiNDExMjRjZDE1NGUzNmY5MjgyNjllNWM2MTA1NjY1NzcyMjZmM2NjNDY2ODlmYTQ3ZGE5Y2I5ODU5MjM4NWZkMjg0YzcyNDZkZjY3OGI0ODFlZTA3OGYzOGEwNjE1MmJjMDQ1ZGNkZmJiMjI1MTJiZGU0MmFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiZDc0M2U2MzFmM2Y2ZDdkOGE4Zjc4NWE1MTZhNWMyZWJiZTcwZWJjNGY3OGNkYjJhYTcwOTNhNDYzYmM5N2M4NjZjNTc5NDg2ODE4ODZlMTllZTEwMGFmNjc2NjA1NjBhODE2MGZjMTBjMzJkNTcwNDVkYjQxNmNiMTBlMzZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5YjIwZTUyMDU1ZmFjZDU3MTU2OTI4OThiODJiYTliZWVjOGU4ZjM3MzM1OTNkNWYxOTcxODlhOGNjYTEyY2M0OGE0ZDdkNGQ3ZTViZGY0NTNmNzM0NDRlNjI2ODRjZjVkMzlmMDVhNDBmMDQ2YjBmMzkwYWFiMTJlMjg0MzU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNGI1ZWNjYmI5YWZiYjZiYjJlNWZlNjEzMmM2OGQwMzQ0NGNiMDk0OTQ0ZGI3OTU3NTZlOGY0MjZmYjAyNDk1YWJhY2M5ZWYyMWQ2YTgxYTQ3NzAwZGNjZDAzNWI2MTQ0MTFmMDk1M2UzNmI1NzQ3NTkyYjUyNTUyZDIzNzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzQ3ODRhMzhhMzRkNTYxMzMxNmZjYzc2OGJkMzQzNTA5ZGIzODhhZWZhNTg0M2I2ZjA3MGQxMzhjNTI3OThjODBjMjYwZGZkN2E1NTZjOWVkNGNmZjNmNjgwNDUxOTNjM2RjMTM3YjM5YmRmNjYyZDFkMzQ0M2M0NWY1YzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3MDUyOTJjZjcxZWE3ZjkxZTY1YzFlOTBjMDA3NDA4YmEwMThlODVlYTBlZjJlNzRlM2Y5OGMyOWJkYTRjNjA5NGI4ZTRlYjM4ODc1MjhjNmE2YzE5ZmZkYzFmNGI4OWZjZDQxMjNlNzMwMzAxYmRmNmE0YjY3OTU1MGNlYjQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3MzFjODI0YjFkOWI0MTc3ZmIzZmViNWExZWIwN2ExYzVkZjNjYTFlYTQ3NmExZTU1ODZlMTBjYjNmOTNjMTRkM2Q0MzZmOTE0ODk2MTkzMjkyMWVlZWYyM2ViZTMwZmI2YmIyMzMwNDRmYmVlYjc2YzZmOGUzMzU0YjllNmU1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ODQzMTYzYTc0YjkyZGUxMDZjMjI5ZTAxZTdkYWI3M2VlYzExMTdlMzgxNThkYTg1MzYyYWY5Y2ExMGZkOGVjNmZmODU3ZjlhMzliNGUyYTM3YmE2YTZiMGQ5MmY3NjM1MzA1MmE1MGFlZWQ5YzUwMDZiNDYyZTZkNjRiY2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM2YzIzOGMzMGE5ZmY4NjYzZmQyNmI1NzhiYjkzZWMyMGRkNjVhYWE3ZWNkYTRjYzI4MzU2Nzk0OTE0NjQ1ODkxZGY4Zjc5ZTFiMjMyMjZhODQ5YTA3ZDRhOWY1ZGRlMzUzOTk1MzQyNmE5ZWE0MWY2MzhiZTY4ZjIxNDdkYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1YmE5ZWVkMjFhYjYzZWEyZDA5ZmUyZTEyN2E0NjFjYzhhM2ViMTc4YmNmN2NmMTk1YTdmNGJhMjNhMDI1YzU4NjM3MjFjNjE5ZTQ0ZWY5NzU1MTgyM2ZhMzg4ZDI1ZjRjZDEwNTRjYjJhYzhhNjFhMGMxMWZjMzcyMWM2MGY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGI2MTQwYjdjZTkwOTJmODZmNWYyMTE5ZDg3MTcxMjUyNGUyYTRlZGMzMjBlMDk3MjkyZmNiOGExYjViZjc5OWE3ZDJkZjAyOTA3Y2VkZGVhMmEyZmMzMmZjMDBiNGU5MjgzOWNjYmI2NThiNzVlNDQwMzI5MTA1ZjgxYWM5YWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhZTJmMWY0MjYwMGJiOTcyOGVjMWQxZTdhY2U3ZTUzYTRmNjlkMzZkZTVhOGZjZmJjODUwZmM0ZmRhOGJlYjQ2MzdiYTYwYTVlYTBjNmNmYTBlZjVjYjlhMWQ4MjE2MWE3NzNkZDQ3ZTRkNGU3NjZjY2E2NTU4ODg4M2U5MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYWVmZDllMjM3MDlmZDFjZWM4ZDZkZDFlZDBhYzEyNTI1OWFlM2E4YmNhYTJiOTE4YmIzNzNhNjllN2VmNzlhMzljZDZkOWNmNjY3NDM2Njc2NzQ5NGUzOTM4MzMyZDI3MDM3MTA0MmY4MjMyNGM4MzQ2YmU1ODU3MThkN2JjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZTg3NTRjMjk4OTNiZGY4OGFlZDI5YzI2ZmFjMDczYjUwYTJmMDEyZWE5YzZjNDBhNTI0MTQwY2ZmY2VhZWE0YjllMmJlNGQ0NjRlMjczYmZhODRjY2QyN2RjMzQ5NzdkYzc2NzJhNDNlZmEzM2IyYTIyODg0NTFhMWEwMjE5NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ1ZjJjOWQ4YzQxZjFiOGJhOTg3ZWI4NzRjMjYzNTA5YjIyZDkwYWZhM2EzZjNiYjg4MWRiOWYwZTgwYmE2YTNiMzkzYTkzMGViYjI5MWU2ZjQ3M2VlNTYwNTMwZmNjZWVmM2YzMWZkMzYwZmUzMTI1OTEyNWFlZmE0ODc4ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJmNGFmOGY2OWNmMWQ0OWY3YmFmOWNhNDQyNzM0Y2M3OWI5NzJiOTk3YmRlMWIwZjhjODcwNDlhOWViZDRiZGY0ZjE2MWJmNzRkN2Q3ZGFkMTg4MTBiOWVhZGQxODIwNjhmNjIwMmQzNDZhMGJlNTBmNWM2NDI3YzA5NzA3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZjN2FmMmY2YTgxYWNlYWJmNTk5YjAxYjdiZjU2YWE2NzQ2NzQ5NGU4NTEyNTAxOWU1YjhiNTFkZmMwMWVmMGQ2NTk3OWY5MmY1ZTZiY2MzMGM1YTEyN2ExZWYxNjliOWNhOWU0ODcxODM3YmUxYjQ3MGIyODg2ZjdkYmU1Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGZjY2YwNjY3NmEwZjU1NjdkNzE3MzViZGJiZjE5OTk0NjQ4NjRhNGYyNGFhZjVjZTY1ZjE3OWZiOWM3YzcxNjMxNDVlMjE1OTE3ZWIzYjMwMWE2Zjg0YWNjY2UwZDFkMTg2YzlmNjRjOThiNmIzZTdmY2E5ZDY1M2FjOWI4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2MDk3MWVkZGVjOWU5MzZiMjEyNzQ5MmZiYzZhMmQ1MDAwZTRmNGE1OTAzZTNmMTI4NmFmZjM4ODIzYmU2NTcyNWRiMjJiMDE0OGMzYzM2MjhkZGJhZWI2MzdmM2U0NDk2OWY0M2FjYTM3YjAyZjJkZDVjOGQyM2I4Zjc0YTY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU1MzE1YTY0YmZkMzE4YWY5YjM1MGU0M2FhZGRlZjYxOGI5ZTA1MjMyMjdkZGI0MWRmM2IzNmJhNzA4NzYwMDQ1YjRjNGUxMmY4YmIwYzdlNTRhYzI0YmFkZDIxM2UwY2Y5ZDVjMDQzNmZkZDM4ZGJhNzBiNDg3MTYyYTI5MjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTAwMTQyODc0MTBiNzJjZjcwODhkMjY1ODQ2NjAxNzExNjcxM2Y0ZDE0MDdkY2E5NzE5ODkyNjk2NTY1ZDBhYmIxMmFmMTY0NTZlMjRkYTkxYzhhMjYyMGUwNThkMDZiOTBmOGI1MTA1ZTM1YzY5NzZiMDcwNDVmN2U1YzMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjdmMTFlYWVhNjE0YzE5MWY5OGM4ZDU3ZmM3MTQ5ZWY4ODM4MDMzN2JmZjQ5Y2FkOTM0YzdiM2ZmMWZhYjNhMDhiZTc0ZjY2ZmZlYTk1YWFhMmI5YzQ0M2IzZmUwNWNkN2Y5MDE3NWY4MzY3ZmViODc0NWJiYzI0MTg3MjczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTZkY2EwM2E2OTRhYjdkYTg5OWNjY2FiMzhkNDdjMDYxODYwYjI2ZjFkNzI5MjlmMzBhZDY4NDE5MWY4MDc0M2Y4NTc3OGY0YWIwYTZjYjQ1ZDA5YzBlZWIzMGM0OThhYWIzOGE0OWM2NGU5NmFiYTRhNTQxODZkZDgyYzA4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjQ2NTMzMDdmODA2ZjEzYjJhZGI1OTZiYjZlMjRjYWZlOGYwODM0NDJmOGI1MGIzMmEwZWNhYjFhZjhkZWU1MmI2YTliODNlNjRiYzJkNjZiZDVkZDQyM2RkZjA2YTEyMTQxZjlhYjhlNjRjYjI2MTQwNjRlZTY1MmQwNDAwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2QzYTI1NjM2ZTU0Mjc4YjMzZjZjMzYyMTQ3ODg5ZTZmZjEwYmVkYTgwYzA3ZTZhMTZkMTkwNDdiN2IzYzZhMzRkNzMwZTliM2NmYzlmODUxMWI2ZTI3YjZhNjk3NzY0Zjk2ODNkNzBkZjcwODZlMDg1ZjkzZDdmOTVmYzRmZmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmViMGMxYTI0OTY2ZDRhYmZmYTJjMThjMmZiMjhkZDUwNGRjYjNiNzIzZDgzMDBjMTBlOTQzOTQ0OTNjNTRlMTgwMjQ1MjdmZGU3MDFkN2VkNTkzYjI2NWU0NTZkMmQ0OGMxNWUwZDUwMTAxMDhlZmQxODcyYjc0YTI1MTRjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Yzg0ZDA3NmUwYTQxOWZjODYzN2FiMzhmMjQ0MzM4YzQ3NmM1MDEzMmNmZTA5MDAyZGRkY2JiZmNkMzY1YmY2Y2YzZDMyYjA5ZGEzMjUyNWY3NWI2MGY1ZmM2NjBkZGMwZTA4ZjM2YTYwN2JhMDc3ZjU5OWJjNTVmMjllY2IzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3RyYW1wb2xpbmUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0ZWFiOWFmZjc5ZTMyZDc0ZmNlOWZiYmQ1OGJmOGRjZWZkMDU2NGRiYjRkYmNlZGE5ZWJhYWM1NWY2MWUxZTMxZGViNTE1YWNmYTZjYzQzNmM3NjE4NmJlY2E2ODM0ODgxY2ZhM2Y1MmE3YjhiZDc2YTY5YjNjZDkxNjJhMjI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW1wb2xpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW1wb2xpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYmFlM2E2ZWFhYTkzNmU0YmFjYjc0YTlkZDM4ZWM1OGU4OTU3YTEyYTQwODk3NGUyMzM4MjJiZjYxNzEyZmY4MzYwMGY5OGRlOTI3YTRkM2M0NGY0ODNlMTZiNjA0ZjgxNzQ0MmUwMjdkMTdkYTk1YmYzNjY4ZTAwMzQ5NjQ5NiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmRmZGI3YWQ4NDNhNzE4ODhiNTZhZTZmZGMzMWQ0MjJlMjUxMzE4ZDY4OWE4MWJhNjZmYjNkNTM0MWQwMTgzMzg5YzVhZTg4ZDZlYjA2OGMxNDA0OGQ1NzQzNDkxNzc5ZDUzNDkwNzQxYWFkMjkxYjlkZmNhMGJmYmJhNjgyODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllZjk1NGVhYzIwYzVlMTljMmY2ZDE4MzNjMmI1M2JkM2MzZmMxMDA0MDA4N2U3YmM3ZDY0YTJiM2ZjNTkzMzVjNjJkZWMxZGQ4YzBjY2RiMDI1ZWZkYmFjOTFiMzQ3ZTQzZjJiMzI0ZTNkOTE1NmU2N2JhZWQxN2ExNDNkZjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZTc5NjhhYzZlYjg1YTVmMDVjOGM2ZTRkNjJmZjY0YTY4YWM5NDQ1MjkyN2QzY2FkZWJkYTE3ZDAzYTk1MWZmMTkzN2EyZjU3NDNiMTVlNjlhNDU1NDM5ODJlMTdjOWE4MWJmMzRjM2NhZTI2MzUzY2MxY2JiZjQzMTI1NzcyYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZjZlMjM5ZTY0YWU2ZDk2M2IyMDhjODllZjc5ZWNjYWM4YzVhNjYzMzQ4N2NiZjY1ODNkNmY2NDdmYTlmM2VhNDVlNTlhZjRkODRjZmU4ZWFlNzliZDdkMTIyY2JjMmMyNzA4ZTYyOTAyNjc5MTI2YmYyMjFlYjZkZWRmZWU3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OWI3NDE3ZGE4ZGU2YTYzMTgyMDJhZTYzZGVjZDI5ZTYwMjNjOWY1ZmZlMTdkMWYyZmUxYTA2MGZlZDlmYzE4OGViMDljYTdmNWRlMDk1OGE3MzFmNGE0MmM4Njk2M2ZhODkxZTJhNmE2YTQyZDJlNzA2MWRlMjg0NmM1ZGRiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1MWQ1OWZhN2FkOTRjMjRhZjljMTBkZDRkMzYxMzNiNjUzNWNhYzIyYjI3Y2I5YmJiMjYxN2FhOWUwMmU5ZTdmZjhhMTkyODcxMmVhODM3OWMzMjhkMjc5OWJkOTA0ZTJjMGRmOWM5YzVhMmY1MjlkZjk2OGQ1NTVjZDhiMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNzQ4M2MwODgxNjlkZTlhY2RkZDlhZjEwZjViYzRiZTBiMzU4YjRjZDg0M2VjNzE3OWFiYzMwMDJhZDBhMmQ4OTQ2OGZlZjliNTNhMzg3YjA3ZTE1ZjViZDg0MzAxMmRiZGY4M2YwOWNjOWNkY2EwNTlkYTVjMDkyNTUzYWY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg3MDM0Yjg3ZjRlYzNlMjkzZTIxMjgzNjAwNGFiNWM5NTkwZTg2YTI1ZGMyZDc2ZWM4MWVjNzI5YzUwYzlkYTUyODQxMDY1ZmNhNDM0MzRjMWJkMDc5MjZkZDQ3NDIwMDNmNWUzODYwYTU3ZDM0NmVlMTdiZmRiZjhkNzdhZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGFlZDBmNGFiMWIxNWM5ODE2NGIxNGZkYTM1YTJmOTcwNjQ3Zjc1M2UwMTlmNzEwYmY1ZGRlOTVmZTQ0OTNiM2ZmMTExOWNmMWRmNDQ1MzdkYzE1NDNkZDdiNDJlNjcwYjRhMDVhMzVhYjBmNTI4ZGM2NjA0YzFmMWQzYjg4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MTA5MjlmZWFkZDYwYTZhYjIyNTUxZWQ0OWIwN2VlZjNmNjA3NDhlODYyMTBlMDA1NTU1MWRiNDlhYWUyNzViODI3Mjc0MTUxZjliOGQ4NjFiZTY5NDZmYmNkMjc5ZWJhMDVlYjIwZWQyM2MxNjhjYTY2ZGY5OTVlYjBlZDNlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAH1sUNdkEAADZBAAALwAAAEBhZ29yaWMvc3Bhd25lci12MC42LjktdTIxLjAvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW1wb3J0QnVuZGxlLEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ltcG9ydC1idW5kbGVcIiwgW1tcImltcG9ydEJ1bmRsZVwiLFskaM2PX2EgPT4gKGltcG9ydEJ1bmRsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkUm9vdE9iamVjdCwnbmFtZScse3ZhbHVlOlwiYnVpbGRSb290T2JqZWN0XCJ9KTskaM2PX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7XG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHMgPSB7XG4gIFZhdERhdGEsXG4gIGNvbnNvbGUsXG4gIC8vXG4gIGFzc2VydDogZ2xvYmFsVGhpcy5hc3NlcnQsXG4gIEJhc2U2NDogZ2xvYmFsVGhpcy5CYXNlNjQsIC8vXG4gIFVSTDogZ2xvYmFsVGhpcy5VUkwgIC8vXG59O1xuXG4gICAgICAgZnVuY3Rpb24gYnVpbGRSb290T2JqZWN0KCkge1xuICByZXR1cm4gRmFyKCdyb290Jywge1xuICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKSB7XG4gICAgICBjb25zdCBucyA9IGF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUsIHsgZW5kb3dtZW50cyB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0Rm4gPSBucy5kZWZhdWx0O1xuICAgICAgcmV0dXJuIEZhcignc3Bhd25lZCBidW5kbGUnLCB7XG4gICAgICAgIGFzeW5jIHN0YXJ0KGFyZ3NQKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IGFyZ3NQO1xuICAgICAgICAgIHJldHVybiBzdGFydEZuKGFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADjUnGd1AgAAdQIAABsAAABAZW5kby9iYXNlNjQtdjEuMC45L2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVjb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXRvYiA9IGVuY29kZWREYXRhID0+IHtcbiAgY29uc3QgYnVmID0gZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbn07JGjNj19vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAksKTjzQDAAA0AwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc3siaW1wb3J0cyI6WyIuL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbImJ0b2EiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBlbmNvZGVCYXNlNjQ7JGjNj19pbXBvcnRzKFtbXCIuL2VuY29kZS5qc1wiLCBbW1wiZW5jb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBidG9hID0gc3RyaW5nVG9FbmNvZGUgPT4ge1xuICBjb25zdCBieXRlcyA9IHN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG4gICAgY29uc3QgYiA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoYiA+IDB4ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBiO1xuICB9KTtcbiAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICByZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG59OyRozY9fb25jZS5idG9hKGJ0b2EpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAR7dn+5AQAAuQEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoValSLkBAAC5AQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiLCIuL3NyYy9kZWNvZGUuanMiLCIuL2J0b2EuanMiLCIuL2F0b2IuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9jb21tb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFscGhhYmV0NjQiLCJtb25vZHU2NCIsInBhZGRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuICAgICAgIGNvbnN0IHBhZGRpbmcgPSAnPSc7JGjNj19vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAgICBjb25zdCBhbHBoYWJldDY0ID1cbiAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuICAgICAgIGNvbnN0IG1vbm9kdTY0ID0ge307JGjNj19vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgYWxwaGFiZXQ2NC5sZW5ndGg7IGkgKz0gMSkge1xuICBjb25zdCBjID0gYWxwaGFiZXQ2NFtpXTtcbiAgbW9ub2R1NjRbY10gPSBpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0IiwianNEZWNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtb25vZHU2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsWyRozY9fYSA9PiAobW9ub2R1NjQgPSAkaM2PX2EpXV0sW1wicGFkZGluZ1wiLFskaM2PX2EgPT4gKHBhZGRpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0RlY29kZUJhc2U2NCA9IChzdHJpbmcsIG5hbWUgPSAnPHVua25vd24+JykgPT4ge1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKChzdHJpbmcubGVuZ3RoICogNCkgLyAzKSk7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcbiAgbGV0IGkgPSAwOyAvL1xuICBsZXQgaiA9IDA7IC8vXG5cbiAgd2hpbGUgKGkgPCBzdHJpbmcubGVuZ3RoICYmIHN0cmluZ1tpXSAhPT0gcGFkZGluZykge1xuICAgIGNvbnN0IG51bWJlciA9IG1vbm9kdTY0W3N0cmluZ1tpXV07XG4gICAgaWYgKG51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuICAgIH1cbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA2KSB8IG51bWJlcjtcbiAgICBxdWFudHVtICs9IDY7XG4gICAgaWYgKHF1YW50dW0gPj0gOCkge1xuICAgICAgcXVhbnR1bSAtPSA4O1xuICAgICAgZGF0YVtqXSA9IHJlZ2lzdGVyID4+PiBxdWFudHVtO1xuICAgICAgaiArPSAxO1xuICAgICAgcmVnaXN0ZXIgJj0gKDEgPDwgcXVhbnR1bSkgLSAxO1xuICAgIH1cbiAgICBpICs9IDE7XG4gIH1cblxuICB3aGlsZSAocXVhbnR1bSA+IDApIHtcbiAgICBpZiAoaSA9PT0gc3RyaW5nLmxlbmd0aCB8fCBzdHJpbmdbaV0gIT09IHBhZGRpbmcpIHtcbiAgICAgIHRocm93IEVycm9yKGBNaXNzaW5nIHBhZGRpbmcgYXQgb2Zmc2V0ICR7aX0gb2Ygc3RyaW5nICR7bmFtZX1gKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIGkgKz0gMTtcbiAgICBxdWFudHVtIC09IDI7XG4gIH1cblxuICBpZiAoaSA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbiAgICAgICAgaSxcbiAgICAgICl9IGluIHN0cmluZyAke25hbWV9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgaik7XG59O1xuXG4vL1xuLy9cbiRozY9fb25jZS5qc0RlY29kZUJhc2U2NChqc0RlY29kZUJhc2U2NCk7Y29uc3QgYWRhcHREZWNvZGVyPVxuICBuYXRpdmVEZWNvZGVCYXNlNjQgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBkZWNvZGVkID0gbmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGVkKTtcbiAgfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVjb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZFxuICAgID8gYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSlcbiAgICA6IGpzRGVjb2RlQmFzZTY0OyRozY9fb25jZS5kZWNvZGVCYXNlNjQoZGVjb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRGVjb2RlQmFzZTY0IjpbImpzRGVjb2RlQmFzZTY0Il0sImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImVuY29kZUJhc2U2NCIsImpzRW5jb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIixbJGjNj19hID0+IChhbHBoYWJldDY0ID0gJGjNj19hKV1dLFtcInBhZGRpbmdcIixbJGjNj19hID0+IChwYWRkaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0VuY29kZUJhc2U2NCA9IGRhdGEgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBsZXQgc3RyaW5nID0gJyc7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBiID0gZGF0YVtpXTtcbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA4KSB8IGI7XG4gICAgcXVhbnR1bSArPSA4O1xuICAgIGlmIChxdWFudHVtID09PSAyNCkge1xuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxOCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMikgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA2KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDApICYgMHgzZl07XG4gICAgICByZWdpc3RlciA9IDA7XG4gICAgICBxdWFudHVtID0gMDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHF1YW50dW0pIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDIpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA8PCA0KSAmIDB4M2ZdICtcbiAgICAgICAgcGFkZGluZyArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE2OlxuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA0KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPDwgMikgJiAweDNmXSArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5qc0VuY29kZUJhc2U2NChqc0VuY29kZUJhc2U2NCk7XG4gICAgICAgY29uc3QgZW5jb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZCA/IGdsb2JhbFRoaXMuQmFzZTY0LmVuY29kZSA6IGpzRW5jb2RlQmFzZTY0OyRozY9fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRW5jb2RlQmFzZTY0IjpbImpzRW5jb2RlQmFzZTY0Il0sImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1hcCA9IChvcmlnaW5hbCwgbWFwRm4pID0+IHtcbiAgY29uc3QgZW50cyA9IGVudHJpZXMob3JpZ2luYWwpO1xuICBjb25zdCBtYXBFbnRzID0gZW50cy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gLyogICAgICAgICAgICAgICAgICAgICAgICovIChbaywgbWFwRm4odiwgayldKSxcbiAgKTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3BWtwfQIAAH0CAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyIsIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanNcIiwgW11dLFtcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACjFBe6MLQAAjC0AADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRQYWNrYWdlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFja2FnZVBvbGljeSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbiAgICAgICBjb25zdCBzdHJpbmdDb21wYXJlID0gKGEsIGIpID0+IChhID09PSBiID8gMCA6IGEgPCBiID8gLTEgOiAxKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2Uuc3RyaW5nQ29tcGFyZShzdHJpbmdDb21wYXJlKTtcbmNvbnN0IGN1bXVsYXRpdmVMZW5ndGggPSAobGVuZ3RoLCB0ZXJtKSA9PiB7XG4gIHJldHVybiBsZW5ndGggKyB0ZXJtLmxlbmd0aDtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgcGF0aENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvL1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8vXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgfVxuICAvL1xuICBjb25zdCBhU3VtID0gYS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwgMCk7XG4gIGNvbnN0IGJTdW0gPSBiLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLCAwKTtcbiAgaWYgKGFTdW0gIT09IGJTdW0pIHtcbiAgICByZXR1cm4gYVN1bSAtIGJTdW07XG4gIH1cbiAgLy9cbiAgYXNzZXJ0KGEubGVuZ3RoID09PSBiLmxlbmd0aCk7IC8vXG4gIC8vXG4gIC8vXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGNvbXBhcmlzb24gPSBzdHJpbmdDb21wYXJlKGFbaV0sIGJbaV0pO1xuICAgIGlmIChjb21wYXJpc29uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29tcGFyaXNvbjtcbiAgICB9XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIDA7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5wYXRoQ29tcGFyZShwYXRoQ29tcGFyZSk7XG5mdW5jdGlvbiogZW51bWVyYXRlKGl0ZXJhYmxlKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBbaW5kZXgsIHZhbHVlXTtcbiAgICBpbmRleCArPSAxO1xuICB9XG59XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdCA9IChvYmplY3QsIG1lc3NhZ2UpID0+IHtcbiAgYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoID09PSAwLCBtZXNzYWdlKTtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMsIHVybCkgPT4ge1xuICBpZiAoY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGFzc2VydChcbiAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpLFxuICAgIGBjb25kaXRpb25zIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke2NvbmRpdGlvbnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgZW51bWVyYXRlKGNvbmRpdGlvbnMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgY29uZGl0aW9uc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIG1vZHVsZSwgcmV0YWluZWQsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoe1xuICAgICAgZXh0cmEsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICB9KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBtb2R1bGUsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobW9kdWxlKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgaWYgKHJldGFpbmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgcmV0YWluZWQsXG4gICAgICAnYm9vbGVhbicsXG4gICAgICBgJHtwYXRofS5yZXRhaW5lZCBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cShyZXRhaW5lZCl9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZSA9IChhbGxlZ2VkTW9kdWxlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgeyBsb2NhdGlvbiwgcGFyc2VyLCBzaGE1MTIsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBwYXJzZXIsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EocGFyc2VyKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBpZiAoc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgc2hhNTEyLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgZXhpdCwgLi4uZXh0cmEgfSA9IGFsbGVnZWRNb2R1bGU7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGV4aXQsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBtb2R1bGVEZXNjcmlwdG9yID0gT2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZSA9PT0gbW9kdWxlRGVzY3JpcHRvciAmJiAhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7IGNvbXBhcnRtZW50LCBtb2R1bGUsIGxvY2F0aW9uLCBwYXJzZXIsIGV4aXQsIGRlZmVycmVkRXJyb3IgfSA9XG4gICAgbW9kdWxlRGVzY3JpcHRvcjtcbiAgaWYgKGNvbXBhcnRtZW50ICE9PSB1bmRlZmluZWQgfHwgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGxvY2F0aW9uICE9PSB1bmRlZmluZWQgfHwgcGFyc2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IsIHBhdGgsIHVybCk7XG4gIH0gZWxzZSBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBkZWZlcnJlZEVycm9yLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBtb2R1bGUgZGVzY3JpcHRvciwgZ290ICR7cShhbGxlZ2VkTW9kdWxlKX0gaW4gJHtxKFxuICAgICAgICB1cmwsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcyA9IChhbGxlZ2VkTW9kdWxlcywgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IG1vZHVsZXMgPSBPYmplY3QoYWxsZWdlZE1vZHVsZXMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZXMgPT09IG1vZHVsZXMgfHwgIUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gICAgYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xuICAgIGFzc2VydE1vZHVsZSh2YWx1ZSwgYCR7cGF0aH0ubW9kdWxlc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2VycyA9IChhbGxlZ2VkUGFyc2VycywgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkUGFyc2VycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhcnNlcnMgPSBPYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZFBhcnNlcnMgPT09IHBhcnNlcnMgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VycyksXG4gICAgYCR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBhcnNlcnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VycykpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAga2V5LFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGUgPSAoYWxsZWdlZFNjb3BlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBPYmplY3QoYWxsZWdlZFNjb3BlKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZSA9PT0gc2NvcGUgJiYgIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuICAgIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgLi4uZXh0cmEgfSA9IHNjb3BlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGVzID0gKGFsbGVnZWRTY29wZXMsIHBhdGgsIHVybCkgPT4ge1xuICBpZiAoYWxsZWdlZFNjb3BlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNjb3BlcyA9IE9iamVjdChhbGxlZ2VkU2NvcGVzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZXMgPT09IHNjb3BlcyAmJiAhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuICAgIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY29wZXMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIGtleSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VHlwZXMgPSAoYWxsZWdlZFR5cGVzLCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRUeXBlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHR5cGVzID0gT2JqZWN0KGFsbGVnZWRUeXBlcyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkVHlwZXMgPT09IHR5cGVzICYmICFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiAgICBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBrZXksXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5ID0gKFxuICBhbGxlZ2VkUG9saWN5LFxuICBwYXRoLFxuICB1cmwgPSAnPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+JyxcbikgPT4ge1xuICBhc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsIHVybCk7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudCA9IChhbGxlZ2VkQ29tcGFydG1lbnQsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudCA9IE9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnQpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50ID09PSBjb21wYXJ0bWVudCAmJiAhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7XG4gICAgbG9jYXRpb24sXG4gICAgbmFtZSxcbiAgICBsYWJlbCxcbiAgICBwYXJzZXJzLFxuICAgIHR5cGVzLFxuICAgIHNjb3BlcyxcbiAgICBtb2R1bGVzLFxuICAgIHBvbGljeSxcbiAgICAuLi5leHRyYVxuICB9ID0gY29tcGFydG1lbnQ7XG5cbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbmFtZSxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGxhYmVsLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmxhYmVsIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsYWJlbCl9YCxcbiAgKTtcblxuICBhc3NlcnRNb2R1bGVzKG1vZHVsZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBhcnNlcnMocGFyc2VycywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0U2NvcGVzKHNjb3BlcywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0VHlwZXModHlwZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBvbGljeShwb2xpY3ksIHBhdGgsIHVybCk7XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzID0gKGFsbGVnZWRDb21wYXJ0bWVudHMsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBPYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRzID09PSBjb21wYXJ0bWVudHMgfHwgIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRzKSxcbiAgICBgY29tcGFydG1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRDb21wYXJ0bWVudHMpfSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKSB7XG4gICAgYXNzZXJ0Q29tcGFydG1lbnQodmFsdWUsIGBjb21wYXJ0bWVudHNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbnRyeSA9IChhbGxlZ2VkRW50cnksIHVybCkgPT4ge1xuICBjb25zdCBlbnRyeSA9IE9iamVjdChhbGxlZ2VkRW50cnkpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZEVudHJ5ID09PSBlbnRyeSAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gICAgYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgbW9kdWxlLCAuLi5leHRyYSB9ID0gZW50cnk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbW9kdWxlLFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke21vZHVsZX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IGFzc2VydENvbXBhcnRtZW50TWFwID0gKFxuICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG4gIHVybCA9ICc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nLFxuKSA9PiB7XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwID0gT2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAgPT09IGNvbXBhcnRtZW50TWFwICYmICFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiAgICBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHtcbiAgICAvL1xuICAgIC8vXG4gICAgdGFnczogY29uZGl0aW9ucyxcbiAgICBlbnRyeSxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgLi4uZXh0cmFcbiAgfSA9IE9iamVjdChjb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydENvbmRpdGlvbnMoY29uZGl0aW9ucywgdXJsKTtcbiAgYXNzZXJ0RW50cnkoZW50cnksIHVybCk7XG4gIGFzc2VydENvbXBhcnRtZW50cyhjb21wYXJ0bWVudHMsIHVybCk7XG59OyRozY9fb25jZS5hc3NlcnRDb21wYXJ0bWVudE1hcChhc3NlcnRDb21wYXJ0bWVudE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VFeHRlbnNpb24gPSBsb2NhdGlvbiA9PiB7XG4gIGNvbnN0IGxhc3RTbGFzaCA9IGxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG4gIGlmIChsYXN0U2xhc2ggPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IGJhc2UgPSBsb2NhdGlvbi5zbGljZShsYXN0U2xhc2ggKyAxKTtcbiAgY29uc3QgbGFzdERvdCA9IGJhc2UubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGxhc3REb3QgPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBiYXNlLnNsaWNlKGxhc3REb3QgKyAxKTtcbn07JGjNj19vbmNlLnBhcnNlRXh0ZW5zaW9uKHBhcnNlRXh0ZW5zaW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3ppcCIsIi4vbGluay5qcyIsIi4vanNvbi5qcyIsIi4vcG93ZXJzLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vaW1wb3J0LWhvb2suanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFppcFJlYWRlcixsaW5rLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwLGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIsYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIixbJGjNj19hID0+IChaaXBSZWFkZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIixbJGjNj19hID0+IChsaW5rID0gJGjNj19hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsWyRozY9fYSA9PiAoam9pbiA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLFskaM2PX2EgPT4gKGFzc2VydENvbXBhcnRtZW50TWFwID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtaG9vay5qc1wiLCBbW1wiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlclwiLFskaM2PX2EgPT4gKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuY29uc3QgeyBhc3NpZ24sIGNyZWF0ZSwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBwb3N0cG9uZUVycm9yVG9FeGVjdXRlID0gZXJyb3JNZXNzYWdlID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cblxuICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgIGltcG9ydHM6IFtdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyID0gKFxuICBnZXQsXG4gIGNvbXBhcnRtZW50cyxcbiAgYXJjaGl2ZUxvY2F0aW9uLFxuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lLFxuICAgIGF0dGVudWF0b3JzXG4gICAgLy9cbiAgICAvL1xuICB9KSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbiAgICBjb25zdCB7IG1vZHVsZXMgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0SG9vayA9IGFzeW5jIG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbiAgICAgIGlmIChtb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICl9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBhd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxuICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShcbiAgICAgICAgICAgICAgYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG4gICAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShtb2R1bGUuZGVmZXJyZWRFcnJvcik7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLnBhcnNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZXIgPSBwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHBhcnNlIH0gPSBwYXJzZXI7XG4gICAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbiAgICAgIGNvbnN0IG1vZHVsZUJ5dGVzID0gZ2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuICAgICAgaWYgKGNvbXB1dGVTaGE1MTIgIT09IHVuZGVmaW5lZCAmJiBtb2R1bGUuc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG4gICAgICAgIGlmIChzaGE1MTIgIT09IG1vZHVsZS5zaGE1MTIpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShcbiAgICAgICAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgICAgICAgKX0gZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZUxvY2F0aW9uID0gYGZpbGU6Ly8vJHttb2R1bGVMb2NhdGlvbn1gO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPSBgLi4uLyR7am9pbihiYXNlLCBtb2R1bGVTcGVjaWZpZXIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZVNvdXJjZUxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPVxuICAgICAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIG1vZHVsZVNwZWNpZmllcikgfHxcbiAgICAgICAgICBzb3VyY2VMb2NhdGlvbjtcbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZU1hcFVybDtcbiAgICAgIGlmIChcbiAgICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbW9kdWxlLnNoYTUxMiAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgc291cmNlTWFwVXJsID0gY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgIG1vZHVsZTogbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIGxvY2F0aW9uOiBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgICBzaGE1MTI6IG1vZHVsZS5zaGE1MTIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgY29uc3QgeyByZWNvcmQgfSA9IGF3YWl0IHBhcnNlKFxuICAgICAgICBtb2R1bGVCeXRlcyxcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlTWFwVXJsLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyByZWNvcmQsIHNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyIH07XG4gICAgfTtcbiAgICByZXR1cm4gaW1wb3J0SG9vaztcbiAgfTtcbiAgcmV0dXJuIG1ha2VJbXBvcnRIb29rO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VBcmNoaXZlID0gYXN5bmMgKFxuICBhcmNoaXZlQnl0ZXMsXG4gIGFyY2hpdmVMb2NhdGlvbiA9ICc8dW5rbm93bj4nLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgYXdhaXQgbnVsbDtcbiAgY29uc3Qge1xuICAgIGNvbXB1dGVTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgZXhwZWN0ZWRTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbiA9IENvbXBhcnRtZW50LFxuICAgIG1vZHVsZXMgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0SG9vazogZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uID0ge30sXG4gICAgX19uYXRpdmVfXyA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiksXG4gICk7XG5cbiAgY29uc3QgYXJjaGl2ZSA9IG5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLCB7IG5hbWU6IGFyY2hpdmVMb2NhdGlvbiB9KTtcblxuICAvL1xuICBjb25zdCB1bnNlZW4gPSBuZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbiAgdW5zZWVuLnNpemUgPj0gMiB8fFxuICAgIEZhaWxgQXJjaGl2ZSBmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhIGNvbXBhcnRtZW50IG1hcCBmaWxlIGFuZCBvbmUgbW9kdWxlIGZpbGUgaW4gJHtxKFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICl9YDtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBnZXQgPSBwYXRoID0+IHtcbiAgICB1bnNlZW4uZGVsZXRlKHBhdGgpO1xuICAgIHJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gIH07XG5cbiAgY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcyA9IGdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxuICBsZXQgc2hhNTEyO1xuICBpZiAoY29tcHV0ZVNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgfVxuICBpZiAoZXhwZWN0ZWRTaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzaGE1MTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaGE1MTIgIT09IGV4cGVjdGVkU2hhNTEyKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEFyY2hpdmUgY29tcGFydG1lbnQgbWFwIGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrLCBleHBlY3RlZCAke2V4cGVjdGVkU2hhNTEyfSwgZ290ICR7c2hhNTEyfSwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwVGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgY29uc3QgY29tcGFydG1lbnRNYXAgPSBwYXJzZUxvY2F0ZWRKc29uKFxuICAgIGNvbXBhcnRtZW50TWFwVGV4dCxcbiAgICAnY29tcGFydG1lbnQtbWFwLmpzb24nLFxuICApO1xuICBhc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCwgYXJjaGl2ZUxvY2F0aW9uKTtcblxuICBjb25zdCB7XG4gICAgY29tcGFydG1lbnRzLFxuICAgIGVudHJ5OiB7IG1vZHVsZTogZW50cnlNb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50OiBlbnRyeUNvbXBhcnRtZW50TmFtZSB9LFxuICB9ID0gY29tcGFydG1lbnRNYXA7XG5cbiAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgIG1vZHVsZXMsXG4gICAgZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gIH0pO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtYWtlSW1wb3J0SG9vayA9IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuICAgICAgZ2V0LFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgeyBjb21wYXJ0bWVudCwgcGVuZGluZ0pvYnNQcm9taXNlIH0gPSBsaW5rKGNvbXBhcnRtZW50TWFwLCB7XG4gICAgICBtYWtlSW1wb3J0SG9vayxcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyhtb2R1bGVzIHx8IHt9KS5tYXAoc3BlY2lmaWVyID0+IHtcbiAgICAgICAgICByZXR1cm4gW3NwZWNpZmllciwgeyBuYW1lc3BhY2U6IHt9IH1dO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbixcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbiAgICBhd2FpdCBjb21wYXJ0bWVudC5sb2FkKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgICB1bnNlZW4uc2l6ZSA9PT0gMCB8fFxuICAgICAgRmFpbGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbiAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgKX1gO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBhc3luYyBvcHRpb25zID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24gPSBDb21wYXJ0bWVudFBhcnNlT3B0aW9uLFxuICAgICAgX19uYXRpdmVfXyxcbiAgICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgICAgbW9kdWxlcyxcbiAgICAgIGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gICAgfSk7XG4gICAgY29uc3QgbWFrZUltcG9ydEhvb2sgPSBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbiAgICAgIGdldCxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICAgIGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgKTtcbiAgICBjb25zdCB7IGNvbXBhcnRtZW50LCBwZW5kaW5nSm9ic1Byb21pc2UgfSA9IGxpbmsoY29tcGFydG1lbnRNYXAsIHtcbiAgICAgIG1ha2VJbXBvcnRIb29rLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24sXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG4gICAgLy9cbiAgICByZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgfTtcblxuICByZXR1cm4geyBpbXBvcnQ6IGV4ZWN1dGUsIHNoYTUxMiB9O1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnBhcnNlQXJjaGl2ZShwYXJzZUFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGxvYWRBcmNoaXZlID0gYXN5bmMgKFxuICByZWFkUG93ZXJzLFxuICBhcmNoaXZlTG9jYXRpb24sXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHJlYWQsIGNvbXB1dGVTaGE1MTIgfSA9IHVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG4gIGNvbnN0IHtcbiAgICBleHBlY3RlZFNoYTUxMixcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24sXG4gICAgbW9kdWxlcyxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhcmNoaXZlQnl0ZXMgPSBhd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG4gIHJldHVybiBwYXJzZUFyY2hpdmUoYXJjaGl2ZUJ5dGVzLCBhcmNoaXZlTG9jYXRpb24sIHtcbiAgICBjb21wdXRlU2hhNTEyLFxuICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICBtb2R1bGVzLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubG9hZEFyY2hpdmUobG9hZEFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGltcG9ydEFyY2hpdmUgPSBhc3luYyAocmVhZFBvd2VycywgYXJjaGl2ZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpO1xuICByZXR1cm4gYXJjaGl2ZS5pbXBvcnQob3B0aW9ucyk7XG59OyRozY9fb25jZS5pbXBvcnRBcmNoaXZlKGltcG9ydEFyY2hpdmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VBcmNoaXZlIjpbInBhcnNlQXJjaGl2ZSJdLCJsb2FkQXJjaGl2ZSI6WyJsb2FkQXJjaGl2ZSJdLCJpbXBvcnRBcmNoaXZlIjpbImltcG9ydEFyY2hpdmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanN7ImltcG9ydHMiOlsiLi9wYXJzZS1wcmUtY2pzLmpzIiwiLi9wYXJzZS1qc29uLmpzIiwiLi9wYXJzZS10ZXh0LmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzOyRozY9faW1wb3J0cyhbW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VySnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKHBhcnNlclRleHQgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJQcmVNanMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gT2JqZWN0LmZyZWV6ZShcbiAgLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgICAncHJlLWNqcy1qc29uJzogcGFyc2VyUHJlQ2pzLFxuICAgICdwcmUtbWpzLWpzb24nOiBwYXJzZXJQcmVNanMsXG4gICAganNvbjogcGFyc2VySnNvbixcbiAgICB0ZXh0OiBwYXJzZXJUZXh0LFxuICAgIGJ5dGVzOiBwYXJzZXJCeXRlcyxcbiAgfSksXG4pOyRozY9fb25jZS5kZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSI6WyJkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlxQl1NwIAADcCAAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qcyIsIi4vaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSxwYXJzZUFyY2hpdmVMaXRlLGxvYWRBcmNoaXZlTGl0ZSxpbXBvcnRBcmNoaXZlTGl0ZTskaM2PX2ltcG9ydHMoW1tcIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1wiLCBbW1wiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlXCIsWyRozY9fYSA9PiAoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzXCIsIFtbXCJwYXJzZUFyY2hpdmVcIixbJGjNj19hID0+IChwYXJzZUFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImxvYWRBcmNoaXZlXCIsWyRozY9fYSA9PiAobG9hZEFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImltcG9ydEFyY2hpdmVcIixbJGjNj19hID0+IChpbXBvcnRBcmNoaXZlTGl0ZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2UgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UsIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcbiAgcmV0dXJuIHsgLi4ucmVzdCwgcGFyc2VyRm9yTGFuZ3VhZ2UgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlQXJjaGl2ZSA9IGFzeW5jIChcbiAgYXJjaGl2ZUJ5dGVzLFxuICBhcmNoaXZlTG9jYXRpb24gPSAnPHVua25vd24+JyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PlxuICBwYXJzZUFyY2hpdmVMaXRlKFxuICAgIGFyY2hpdmVCeXRlcyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbiAgICAgICBjb25zdCBsb2FkQXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+XG4gIGxvYWRBcmNoaXZlTGl0ZShcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICBhc3NpZ25QYXJzZXJGb3JMYW5ndWFnZShvcHRpb25zKSxcbiAgKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbiAgICAgICBjb25zdCBpbXBvcnRBcmNoaXZlID0gYXN5bmMgKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucykgPT5cbiAgaW1wb3J0QXJjaGl2ZUxpdGUoXG4gICAgcmVhZFBvd2VycyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb2xpY3kuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydE5vd0hvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzeW5jVHJhbXBvbGluZSxzeW5jVHJhbXBvbGluZSxyZXNvbHZlLGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZW5mb3JjZU1vZHVsZVBvbGljeSx1bnBhY2tSZWFkUG93ZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wiYXN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoYXN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcInN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLFskaM2PX2EgPT4gKHJlc29sdmUgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIixbJGjNj19hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRozY9fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsWyRozY9fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VJbXBvcnROb3dIb29rTWFrZXIsJ25hbWUnLHt2YWx1ZTpcIm1ha2VJbXBvcnROb3dIb29rTWFrZXJcIn0pOyRozY9fb25jZS5tYWtlSW1wb3J0Tm93SG9va01ha2VyKG1ha2VJbXBvcnROb3dIb29rTWFrZXIpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzLCBhc3NpZ24sIGNyZWF0ZSB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLypcblxuXG4gKi9cbmNvbnN0IGhhcyA9IChoYXlzdGFjaywgbmVlZGxlKSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgaGF5c3RhY2ssIFtuZWVkbGVdKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uID0gKHJlbCwgYWJzKSA9PiBuZXcgVVJMKHJlbCwgYWJzKS50b1N0cmluZygpO1xuXG4vL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSB7XG4gIHJldHVybiAoaGFzKHJlY29yZCwgJ3JlY29yZCcpID8gcmVjb3JkLnJlY29yZC5pbXBvcnRzIDogcmVjb3JkLmltcG9ydHMpIHx8IFtdO1xufVxuXG4vL1xuLy9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyA9IFtcbiAgLy9cbiAgJy5qcycsXG4gICcuanNvbicsXG4gICcubm9kZScsXG4gIC8vXG4gICcvaW5kZXguanMnLFxuICAnL2luZGV4Lmpzb24nLFxuICAnL2luZGV4Lm5vZGUnLFxuXTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZmluZFJlZGlyZWN0ID0gKHtcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICBjb21wYXJ0bWVudHMsXG4gIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyLFxuICBwYWNrYWdlTG9jYXRpb24sXG59KSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllckxvY2F0aW9uID0gbmV3IFVSTChcbiAgICBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICkuaHJlZjtcblxuICAvL1xuICBsZXQgc29tZUxvY2F0aW9uID0gbmV3IFVSTCgnLi8nLCBtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbikuaHJlZjtcblxuICAvL1xuICAvL1xuXG4gIC8vXG4gIGZvciAoOzspIHtcbiAgICBpZiAoXG4gICAgICBzb21lTG9jYXRpb24gIT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UICYmXG4gICAgICBzb21lTG9jYXRpb24gaW4gY29tcGFydG1lbnRzXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHNvbWVMb2NhdGlvbjtcbiAgICAgIGNvbnN0IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChjb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoY29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKFxuICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMoXG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLmxvY2F0aW9uLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9ySGludDogYEJsb2NrZWQgaW4gaW1wb3J0IGhvb2suICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtsb2NhdGlvbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKGFic29sdXRlTW9kdWxlU3BlY2lmaWVyKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHBhcmVudExvY2F0aW9uID0gbmV3IFVSTCgnLi4vJywgc29tZUxvY2F0aW9uKS5ocmVmO1xuXG4gICAgICAvL1xuICAgICAgaWYgKHBhcmVudExvY2F0aW9uID09PSBzb21lTG9jYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgaW1wb3J0IHVua25vd24gbW9kdWxlOiAke3EoYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNvbWVMb2NhdGlvbiA9IHBhcmVudExvY2F0aW9uO1xuICAgIH1cbiAgfVxufTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gKHtcbiAgbW9kdWxlcyA9IHVuZGVmaW5lZCxcbiAgZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gIGVudHJ5Q29tcGFydG1lbnROYW1lLFxufSkgPT4ge1xuICBpZiAoIW1vZHVsZXMgJiYgIWV4aXRNb2R1bGVJbXBvcnRIb29rKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXN5bmMgc3BlY2lmaWVyID0+IHtcbiAgICBpZiAobW9kdWxlcyAmJiBoYXMobW9kdWxlcywgc3BlY2lmaWVyKSkge1xuICAgICAgY29uc3QgbnMgPSBtb2R1bGVzW3NwZWNpZmllcl07XG4gICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgaW1wb3J0czogW10sXG4gICAgICAgIGV4cG9ydHM6IG5zID8ga2V5cyhucykgOiBbXSxcbiAgICAgICAgZXhlY3V0ZTogbW9kdWxlRXhwb3J0cyA9PiB7XG4gICAgICAgICAgbW9kdWxlRXhwb3J0cy5kZWZhdWx0ID0gbnM7XG4gICAgICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIG5zKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBleGl0TW9kdWxlSW1wb3J0SG9vayhzcGVjaWZpZXIsIGVudHJ5Q29tcGFydG1lbnROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcik7XG5jb25zdCBub21pbmF0ZUNhbmRpZGF0ZXMgPSAobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBjYW5kaWRhdGVzID0gW21vZHVsZVNwZWNpZmllcl07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKSB7XG4gICAgY2FuZGlkYXRlcy5wdXNoKGAke21vZHVsZVNwZWNpZmllcn0ke2NhbmRpZGF0ZVN1ZmZpeH1gKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiogY2hvb3NlTW9kdWxlRGVzY3JpcHRvcihcbiAge1xuICAgIGNhbmRpZGF0ZXMsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgY29tcGFydG1lbnRzLFxuICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlU291cmNlcyxcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVPbmx5LFxuICAgIHNvdXJjZU1hcEhvb2ssXG4gICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICB9LFxuICB7IG1heWJlUmVhZCwgcGFyc2UsIHNob3VsZERlZmVyRXJyb3IgPSAoKSA9PiBmYWxzZSB9LFxuKSB7XG4gIGNvbnN0IHsgc291cmNlRGlybmFtZSB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVNwZWNpZmllciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW2NhbmRpZGF0ZVNwZWNpZmllcl07XG4gICAgaWYgKGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvbXBhcnRtZW50OiBjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWUgPSBwYWNrYWdlTG9jYXRpb24gfSA9XG4gICAgICAgIGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuICAgICAgaWYgKGNhbmRpZGF0ZUNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50IG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IgPVxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG4gICAgICBpZiAoY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdID1cbiAgICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbiAgICAgIC8vXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICBzcGVjaWZpZXI6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgY29tcGFydG1lbnQ6IGNhbmRpZGF0ZUNvbXBhcnRtZW50LFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihjYW5kaWRhdGVTcGVjaWZpZXIsIHBhY2thZ2VMb2NhdGlvbik7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbW9kdWxlQnl0ZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICB5aWVsZCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pXG4gICAgKTtcblxuICAgIGlmIChtb2R1bGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGxldCBzb3VyY2VNYXA7XG4gICAgICAvL1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHlpZWxkIHBhcnNlKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICAgIGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vazpcbiAgICAgICAgICAgICAgc291cmNlTWFwSG9vayAmJlxuICAgICAgICAgICAgICAobmV4dFNvdXJjZU1hcE9iamVjdCA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwID0gSlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgYnl0ZXM6IHRyYW5zZm9ybWVkQnl0ZXMsXG4gICAgICAgIHJlY29yZDogY29uY3JldGVSZWNvcmQsXG4gICAgICB9ID0gZW52ZWxvcGU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGNhbmRpZGF0ZVNwZWNpZmllciAhPT0gbW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgIG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl0gPSB7XG4gICAgICAgICAgcmV0YWluZWQ6IHRydWUsXG4gICAgICAgICAgbW9kdWxlOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgICAgY29tcGFydG1lbnQ6IHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgcmVjb3JkOiBjb25jcmV0ZVJlY29yZCxcbiAgICAgICAgc3BlY2lmaWVyOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydE1ldGE6IHsgdXJsOiBtb2R1bGVMb2NhdGlvbiB9LFxuICAgICAgfTtcblxuICAgICAgbGV0IHNoYTUxMjtcbiAgICAgIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuICAgICAgICBpZiAoc291cmNlTWFwSG9vayAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc291cmNlTWFwSG9vayhzb3VyY2VNYXAsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBtb2R1bGU6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICAgIHNoYTUxMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uLnNsaWNlKFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl0gPSB7XG4gICAgICAgIGxvY2F0aW9uOiBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbiAgICAgICAgc291cmNlTG9jYXRpb246IG1vZHVsZUxvY2F0aW9uLFxuICAgICAgICBzb3VyY2VEaXJuYW1lLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIGJ5dGVzOiB0cmFuc2Zvcm1lZEJ5dGVzLFxuICAgICAgICByZWNvcmQ6IGNvbmNyZXRlUmVjb3JkLFxuICAgICAgICBzaGE1MTIsXG4gICAgICB9O1xuICAgICAgaWYgKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbiAgICAgICAgICAgIHJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLCBtb2R1bGVTcGVjaWZpZXIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUltcG9ydEhvb2tNYWtlciA9IChcbiAgcmVhZFBvd2VycyxcbiAgYmFzZUxvY2F0aW9uLFxuICB7XG4gICAgc291cmNlcyA9IGNyZWF0ZShudWxsKSxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBzb3VyY2VNYXBIb29rID0gdW5kZWZpbmVkLFxuICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgIGVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rID0gdW5kZWZpbmVkLFxuICB9LFxuKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmljdGx5UmVxdWlyZWQgPSBuZXcgTWFwKFtcbiAgICBbZW50cnlDb21wYXJ0bWVudE5hbWUsIG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldLFxuICBdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lOiBfcGFja2FnZU5hbWUsXG4gICAgYXR0ZW51YXRvcnMsXG4gICAgcGFyc2UsXG4gICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICAvL1xuICAgIHBhY2thZ2VMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIGJhc2VMb2NhdGlvbik7XG4gICAgY29uc3QgcGFja2FnZVNvdXJjZXMgPSBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gfHwgY3JlYXRlKG51bGwpO1xuICAgIHNvdXJjZXNbcGFja2FnZUxvY2F0aW9uXSA9IHBhY2thZ2VTb3VyY2VzO1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvciA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXSB8fCB7fTtcbiAgICBjb25zdCB7IG1vZHVsZXM6IG1vZHVsZURlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVEZXNjcmlwdG9ycztcblxuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVmZXJFcnJvciA9IChzcGVjaWZpZXIsIGVycm9yKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgICAgICBpbXBvcnRzOiBbXSxcbiAgICAgICAgZXhwb3J0czogW10sXG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXSA9IHtcbiAgICAgICAgZGVmZXJyZWRFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRIb29rID0gYXN5bmMgbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICBhd2FpdCBudWxsO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAhPT0gJy4nICYmICFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgICAgICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2soXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChhcmNoaXZlT25seSkge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplKHsgaW1wb3J0czogW10sIGV4cG9ydHM6IFtdLCBleGVjdXRlKCkge30gfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29uc3QgYXR0ZW51YXRlZFJlY29yZCA9IGF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG4gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gYXR0ZW51YXRlZFJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1heWJlUmVhZCB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcblxuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbm9taW5hdGVDYW5kaWRhdGVzKG1vZHVsZVNwZWNpZmllciwgc2VhcmNoU3VmZml4ZXMpO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFzeW5jVHJhbXBvbGluZShcbiAgICAgICAgICBjaG9vc2VNb2R1bGVEZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgICByZWFkUG93ZXJzLFxuICAgICAgICAgICAgYXJjaGl2ZU9ubHksXG4gICAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtYXliZVJlYWQsIHBhcnNlLCBzaG91bGREZWZlckVycm9yIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZmlsZSBmb3IgaW50ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSAod2l0aCBjYW5kaWRhdGVzICR7Y2FuZGlkYXRlc1xuICAgICAgICAgICAgLm1hcCh4ID0+IHEoeCkpXG4gICAgICAgICAgICAuam9pbignLCAnKX0pIGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZlckVycm9yKG1vZHVsZVNwZWNpZmllciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGltcG9ydEhvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0SG9vaztcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZUltcG9ydEhvb2tNYWtlcihtYWtlSW1wb3J0SG9va01ha2VyKTtcbiAgICAgICBmdW5jdGlvbiBtYWtlSW1wb3J0Tm93SG9va01ha2VyKFxuICByZWFkUG93ZXJzLFxuICBiYXNlTG9jYXRpb24sXG4gIHtcbiAgICBzb3VyY2VzID0gY3JlYXRlKG51bGwpLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBhcmNoaXZlT25seSA9IGZhbHNlLFxuICAgIHNvdXJjZU1hcEhvb2sgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0Tm93SG9vazogZXhpdE1vZHVsZUltcG9ydE5vd0hvb2sgPSB1bmRlZmluZWQsXG4gIH0sXG4pIHtcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaWN0bHlSZXF1aXJlZCA9IG5ldyBNYXAoKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IG1ha2VJbXBvcnROb3dIb29rID0gKHtcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgcGFja2FnZU5hbWU6IF9wYWNrYWdlTmFtZSxcbiAgICBwYXJzZSxcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICBpZiAoISgnaXNTeW5jUGFyc2VyJyBpbiBwYXJzZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlVHJhbnNmb3JtSW1wb3J0Tm93SG9vaygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEeW5hbWljIHJlcXVpcmVzIGFyZSBvbmx5IHBvc3NpYmxlIHdpdGggc3luY2hyb25vdXMgcGFyc2VycyBhbmQgbm8gYXN5bmNocm9ub3VzIG1vZHVsZSB0cmFuc2Zvcm1zIGluIG9wdGlvbnMnLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG5cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCB7XG4gICAgICBtb2R1bGVzOlxuICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgICAgICBjcmVhdGUobnVsbClcbiAgICAgICAgKSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBsZXQgeyBwb2xpY3kgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBwb2xpY3kgPSBwb2xpY3kgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKCdwYWNrYWdlcycgaW4gcG9saWN5ICYmIHR5cGVvZiBwb2xpY3kucGFja2FnZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeUl0ZW1dIG9mIGVudHJpZXMocG9saWN5LnBhY2thZ2VzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcykgJiZcbiAgICAgICAgICBwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3Iuc2NvcGVzICYmXG4gICAgICAgICAgcGFja2FnZVBvbGljeUl0ZW1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbcGFja2FnZU5hbWVdID1cbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5zY29wZXNbcGFja2FnZU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBtYXliZVJlYWROb3csIGlzQWJzb2x1dGUgfSA9IHJlYWRQb3dlcnM7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0Tm93SG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBpZiAoaXNBYnNvbHV0ZShtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGZpbmRSZWRpcmVjdCh7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5vbWluYXRlQ2FuZGlkYXRlcyhtb2R1bGVTcGVjaWZpZXIsIHNlYXJjaFN1ZmZpeGVzKTtcblxuICAgICAgY29uc3QgcmVjb3JkID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICAgIGNob29zZU1vZHVsZURlc2NyaXB0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICBhcmNoaXZlT25seSxcbiAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1heWJlUmVhZDogbWF5YmVSZWFkTm93LFxuICAgICAgICAgIHBhcnNlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydE5vd0hvb2spIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXhpdFJlY29yZCA9IGV4aXRNb2R1bGVJbXBvcnROb3dIb29rKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFleGl0UmVjb3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKG1vZHVsZVNwZWNpZmllcil9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdFJlY29yZDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGltcG9ydCBtb2R1bGU6ICR7cShcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICl9OyB0cnkgcHJvdmlkaW5nIGFuIGltcG9ydE5vd0hvb2tgLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGltcG9ydE5vd0hvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0Tm93SG9vaztcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydE5vd0hvb2tNYWtlciI6WyJtYWtlSW1wb3J0Tm93SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALJuhOsuAwAALgMAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUxvY2F0ZWRKc29uID0gKHNvdXJjZSwgbG9jYXRpb24pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICB0aHJvdyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07JGjNj19vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVF1zgY8lAACPJQAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9tYXAtcGFyc2VyLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNYXBQYXJzZXJzLHJlc29sdmVGYWxsYmFjayxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLGVuZm9yY2VNb2R1bGVQb2xpY3ksbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFwLXBhcnNlci5qc1wiLCBbW1wibWFrZU1hcFBhcnNlcnNcIixbJGjNj19hID0+IChtYWtlTWFwUGFyc2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsWyRozY9fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsWyRozY9fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaM2PX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLFskaM2PX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXNzaWduLCBjcmVhdGUsIGVudHJpZXMsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGFsbFNldHRsZWQgfSA9IFByb21pc2U7XG5cbi8qXG5cblxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZCA9IGFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgZGVmYXVsdENvbXBhcnRtZW50ID0gQ29tcGFydG1lbnQ7XG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW2tleV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeCA9IChtb2R1bGVTcGVjaWZpZXIsIHByZWZpeCkgPT4ge1xuICBpZiAobW9kdWxlU3BlY2lmaWVyID09PSBwcmVmaXgpIHtcbiAgICByZXR1cm4gJy4nO1xuICB9XG4gIGlmIChtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKSB7XG4gICAgcmV0dXJuIGAuLyR7bW9kdWxlU3BlY2lmaWVyLnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKX1gO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlTW9kdWxlTWFwSG9vayA9IChcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudHMsXG4gIGNvbXBhcnRtZW50TmFtZSxcbiAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gIHNjb3BlRGVzY3JpcHRvcnMsXG4pID0+IHtcbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBtb2R1bGVNYXBIb29rID0gbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG4gICAgaWYgKG1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9IGNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgbW9kdWxlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBleGl0LFxuICAgICAgfSA9IG1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vXG4gICAgICB9XG4gICAgICBpZiAoZm9yZWlnbk1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmICghbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvckhpbnQ6XG4gICAgICAgICAgICAgICdUaGlzIGNoZWNrIHNob3VsZCBub3QgYmUgcmVhY2hhYmxlLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnQsXG4gICAgICAgICAgbmFtZXNwYWNlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IFtzY29wZVByZWZpeCwgc2NvcGVEZXNjcmlwdG9yXSBvZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKSB7XG4gICAgICBjb25zdCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyID0gdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzY29wZVByZWZpeCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3JlaWduTW9kdWxlU3BlY2lmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSB9ID0gc2NvcGVEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGltcG9ydCBmcm9tIHNjb3BlICR7c2NvcGVQcmVmaXh9IGR1ZSB0byBtaXNzaW5nIFwiY29tcGFydG1lbnRcIiBwcm9wZXJ0eWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsaW5raW5nLiAke3EoXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgKX0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke3EoXG4gICAgICAgICAgICBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgICl9LmAsXG4gICAgICAgIH0pO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBtb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdID0ge1xuICAgICAgICAgIHJldGFpbmVkOiB0cnVlLFxuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgIG1vZHVsZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50LFxuICAgICAgICAgIG5hbWVzcGFjZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICByZXR1cm4gbW9kdWxlTWFwSG9vaztcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgaW1wb3NzaWJsZUltcG9ydE5vd0hvb2tNYWtlciA9ICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGltcG9zc2libGVJbXBvcnROb3dIb29rKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZWQgcmVhZCBwb3dlcnMgZG8gbm90IHN1cHBvcnQgZHluYW1pYyByZXF1aXJlcycpO1xuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbGluayA9IChcbiAgeyBlbnRyeSwgY29tcGFydG1lbnRzOiBjb21wYXJ0bWVudERlc2NyaXB0b3JzIH0sXG4gIG9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHJlc29sdmUgPSByZXNvbHZlRmFsbGJhY2ssXG4gICAgbWFrZUltcG9ydEhvb2ssXG4gICAgbWFrZUltcG9ydE5vd0hvb2sgPSBpbXBvc3NpYmxlSW1wb3J0Tm93SG9va01ha2VyLFxuICAgIHBhcnNlckZvckxhbmd1YWdlOiBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiA9IHt9LFxuICAgIGdsb2JhbHMgPSB7fSxcbiAgICB0cmFuc2Zvcm1zID0gW10sXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICBfX3NoaW1UcmFuc2Zvcm1zX18gPSBbXSxcbiAgICBfX25hdGl2ZV9fID0gZmFsc2UsXG4gICAgYXJjaGl2ZU9ubHkgPSBmYWxzZSxcbiAgICBDb21wYXJ0bWVudCA9IGRlZmF1bHRDb21wYXJ0bWVudCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudDogZW50cnlDb21wYXJ0bWVudE5hbWUgfSA9IGVudHJ5O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBjcmVhdGUobnVsbCk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXR0ZW51YXRvcnMgPSBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICApO1xuXG4gIGNvbnN0IHBlbmRpbmdKb2JzID0gW107XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGFyc2VyRm9yTGFuZ3VhZ2UgPSBmcmVlemUoXG4gICAgYXNzaWduKGNyZWF0ZShudWxsKSwgcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24pLFxuICApO1xuXG4gIGNvbnN0IG1hcFBhcnNlcnMgPSBtYWtlTWFwUGFyc2Vycyh7XG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29tcGFydG1lbnROYW1lLCBjb21wYXJ0bWVudERlc2NyaXB0b3JdIG9mIGVudHJpZXMoXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbmFtZSxcbiAgICAgIHBhcnNlcnM6IGxhbmd1YWdlRm9yRXh0ZW5zaW9uID0ge30sXG4gICAgICB0eXBlczogbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgPSB7fSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgc2NvcGVzOiBfc2NvcGVzLCBtb2R1bGVzOiBfbW9kdWxlcyB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbnN0IG1vZHVsZXMgPSBfbW9kdWxlcyB8fCBjcmVhdGUobnVsbCk7XG4gICAgY29uc3Qgc2NvcGVzID0gX3Njb3BlcyB8fCBjcmVhdGUobnVsbCk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhcnNlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgbWFwUGFyc2VycyhsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpXG4gICAgKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzaG91bGREZWZlckVycm9yID0gbGFuZ3VhZ2UgPT4ge1xuICAgICAgaWYgKGxhbmd1YWdlICYmIGhhcyhwYXJzZXJGb3JMYW5ndWFnZSwgbGFuZ3VhZ2UpKSB7XG4gICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdKVxuICAgICAgICAgIC5oZXVyaXN0aWNJbXBvcnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcmVzb2x2ZUhvb2sgPSByZXNvbHZlO1xuICAgIGNvbnN0IGltcG9ydEhvb2sgPSBtYWtlSW1wb3J0SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBhdHRlbnVhdG9ycyxcbiAgICAgIHBhcnNlLFxuICAgICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydE5vd0hvb2sgPSBtYWtlSW1wb3J0Tm93SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBwYXJzZSxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZHVsZU1hcEhvb2sgPSBtYWtlTW9kdWxlTWFwSG9vayhcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGNvbXBhcnRtZW50TmFtZSxcbiAgICAgIG1vZHVsZXMsXG4gICAgICBzY29wZXMsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHtcbiAgICAgIG5hbWU6IGxvY2F0aW9uLFxuICAgICAgcmVzb2x2ZUhvb2ssXG4gICAgICBpbXBvcnRIb29rLFxuICAgICAgaW1wb3J0Tm93SG9vayxcbiAgICAgIG1vZHVsZU1hcEhvb2ssXG4gICAgICB0cmFuc2Zvcm1zLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgaWYgKCFhcmNoaXZlT25seSkge1xuICAgICAgYXR0ZW51YXRlR2xvYmFscyhcbiAgICAgICAgY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbiAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV0gPSBjb21wYXJ0bWVudDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbiAgaWYgKGNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgYXNzZW1ibGUgY29tcGFydG1lbnQgZ3JhcGggYmVjYXVzZSB0aGUgcm9vdCBjb21wYXJ0bWVudCBuYW1lZCAke3EoXG4gICAgICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgICAgKX0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF07XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudCxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCxcbiAgICBwZW5kaW5nSm9ic1Byb21pc2U6IHByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyByZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0c1xuICAgICAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIHJlc3VsdCA9PlxuICAgICAgICAgICAgICByZXN1bHQucmVhc29uLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYEdsb2JhbHMgYXR0ZW51YXRpb24gZXJyb3JzOiAke2Vycm9yc1xuICAgICAgICAgICAgICAubWFwKGVycm9yID0+IGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApLFxuICB9O1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5saW5rKGxpbmspO1xuICAgICAgIGNvbnN0IGFzc2VtYmxlID0gKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKSA9PlxuICBsaW5rKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKS5jb21wYXJ0bWVudDskaM2PX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGluayI6WyJsaW5rIl0sImFzc2VtYmxlIjpbImFzc2VtYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANuM78w8FwAAPBcAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9tYXAtcGFyc2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3RyYW1wb2xpbmUiLCIuL2V4dGVuc2lvbi5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXBQYXJzZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgc3luY1RyYW1wb2xpbmUsYXN5bmNUcmFtcG9saW5lLHBhcnNlRXh0ZW5zaW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wic3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChzeW5jVHJhbXBvbGluZSA9ICRozY9fYSldXSxbXCJhc3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChhc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4dGVuc2lvbi5qc1wiLCBbW1wicGFyc2VFeHRlbnNpb25cIixbJGjNj19hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBrZXlzLCBoYXNPd25Qcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuLy9cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlID0gZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gJ2pzJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXIgPSAoXG4gIHByZWZlclN5bmNocm9ub3VzLFxuICBsYW5ndWFnZUZvckV4dGVuc2lvbixcbiAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdHJhbnNmb3JtcztcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgZnVuY3Rpb24qIGdldFBhcnNlckdlbmVyYXRvcihcbiAgICBieXRlcyxcbiAgICBzcGVjaWZpZXIsXG4gICAgbG9jYXRpb24sXG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIG9wdGlvbnMsXG4gICkge1xuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBsYW5ndWFnZTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbiAgICBpZiAoXG4gICAgICAhZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikgJiZcbiAgICAgIGhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciwgc3BlY2lmaWVyKVxuICAgICkge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXSB8fCBleHRlbnNpb247XG4gICAgfVxuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzb3VyY2VNYXA7XG5cbiAgICBpZiAoaGFzKHRyYW5zZm9ybXMsIGxhbmd1YWdlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHtcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBwYXJzZXI6IGxhbmd1YWdlLFxuICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgfSA9IHlpZWxkIHRyYW5zZm9ybXNbbGFuZ3VhZ2VdKFxuICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgc291cmNlTWFwLFxuICAgICAgICAgIH0sXG4gICAgICAgICkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBFcnJvciB0cmFuc2Zvcm1pbmcgJHtxKGxhbmd1YWdlKX0gc291cmNlIGluICR7cShsb2NhdGlvbil9OiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgeyBjYXVzZTogZXJyIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYXJzZSB9ID0gcGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xuICAgIHJldHVybiBwYXJzZShieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCB7XG4gICAgICBzb3VyY2VNYXAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3Qgc3luY1BhcnNlciA9IChieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICBnZXRQYXJzZXJHZW5lcmF0b3IsXG4gICAgICBieXRlcyxcbiAgICAgIHNwZWNpZmllcixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGlmICgndGhlbicgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1N5bmMgcGFyc2VyIGNhbm5vdCByZXR1cm4gYSBUaGVuYWJsZTsgZW5zdXJlIHBhcnNlciBpcyBhY3R1YWxseSBzeW5jaHJvbm91cycsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBzeW5jUGFyc2VyLmlzU3luY1BhcnNlciA9IHRydWU7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXN5bmNQYXJzZXIgPSBhc3luYyAoXG4gICAgYnl0ZXMsXG4gICAgc3BlY2lmaWVyLFxuICAgIGxvY2F0aW9uLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBvcHRpb25zLFxuICApID0+IHtcbiAgICByZXR1cm4gYXN5bmNUcmFtcG9saW5lKFxuICAgICAgZ2V0UGFyc2VyR2VuZXJhdG9yLFxuICAgICAgYnl0ZXMsXG4gICAgICBzcGVjaWZpZXIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfTtcblxuICAvL1xuICAvL1xuICAvL1xuICBpZiAocHJlZmVyU3luY2hyb25vdXMpIHtcbiAgICB0cmFuc2Zvcm1zID0gc3luY01vZHVsZVRyYW5zZm9ybXM7XG4gICAgcmV0dXJuIHN5bmNQYXJzZXI7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSB7XG4gICAgICAuLi5zeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIC4uLm1vZHVsZVRyYW5zZm9ybXMsXG4gICAgfTtcblxuICAgIHJldHVybiBhc3luY1BhcnNlcjtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIG1hcFBhcnNlcnMoXG4gIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIG1vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgcHJlZmVyU3luY2hyb25vdXMgPSBmYWxzZSxcbikge1xuICBjb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMgPSBbXTtcbiAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgZm9yIChjb25zdCBbZXh0ZW5zaW9uLCBsYW5ndWFnZV0gb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpIHtcbiAgICBpZiAoaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sIGxhbmd1YWdlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2JsZW1zLnB1c2goYCR7cShsYW5ndWFnZSl9IGZvciBleHRlbnNpb24gJHtxKGV4dGVuc2lvbil9YCk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgRXJyb3IoYE5vIHBhcnNlciBhdmFpbGFibGUgZm9yIGxhbmd1YWdlOiAke3Byb2JsZW1zLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgcmV0dXJuIG1ha2VFeHRlbnNpb25QYXJzZXIoXG4gICAgcHJlZmVyU3luY2hyb25vdXMsXG4gICAgZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbiAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICBtb2R1bGVUcmFuc2Zvcm1zLFxuICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICApO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcFBhcnNlcnMgPSAoe1xuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG59KSA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGFzeW5jUGFyc2VGbiA9IChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICApO1xuXG4gIGlmIChtb2R1bGVUcmFuc2Zvcm1zICYmIGtleXMobW9kdWxlVHJhbnNmb3JtcykubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBhc3luY1BhcnNlRm47XG4gIH1cblxuICAvL1xuICAvL1xuICBpZiAodmFsdWVzKHBhcnNlckZvckxhbmd1YWdlKS5zb21lKCh7IHN5bmNocm9ub3VzIH0pID0+ICFzeW5jaHJvbm91cykpIHtcbiAgICByZXR1cm4gYXN5bmNQYXJzZUZuO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgcmV0dXJuIChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHRydWUsXG4gICAgKTtcbn07JGjNj19vbmNlLm1ha2VNYXBQYXJzZXJzKG1ha2VNYXBQYXJzZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBQYXJzZXJzIjpbIm1ha2VNYXBQYXJzZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJscmtbPCwAAzwsAADwAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImpvaW4iLCJyZWxhdGl2aXplIiwicmVzb2x2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuICovXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzb2x2ZSA9IChzb2x1dGlvbiwgcHJvYmxlbSkgPT4ge1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSkge1xuICAgIGlmIChwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJycpIHtcbiAgICAgIC8vXG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBpZiAoc29sdXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNvbHV0aW9uLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb2x1dGlvbi5wdXNoKHBhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc29sdmUgPSAoc3BlYywgcmVmZXJyZXIpID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcbiAgcmVmZXJyZXIgPSBTdHJpbmcocmVmZXJyZXIgfHwgJycpO1xuXG4gIGlmIChzcGVjLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuICB9XG4gIGlmICghcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuICB9XG5cbiAgY29uc3Qgc3BlY1BhcnRzID0gc3BlYy5zcGxpdCgnLycpO1xuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBjb25zdCBwcm9ibGVtID0gW107XG4gIGlmIChzcGVjUGFydHNbMF0gPT09ICcuJyB8fCBzcGVjUGFydHNbMF0gPT09ICcuLicpIHtcbiAgICBjb25zdCByZWZlcnJlclBhcnRzID0gcmVmZXJyZXIuc3BsaXQoJy8nKTtcbiAgICBwcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG4gICAgcHJvYmxlbS5wb3AoKTtcbiAgICBzb2x1dGlvbi5wdXNoKCcuJyk7XG4gIH1cbiAgcHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgcHJvYmxlbSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbiAgICAgICAgcmVmZXJyZXIsXG4gICAgICApfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuICAgICAgIGNvbnN0IGpvaW4gPSAoYmFzZSwgc3BlYykgPT4ge1xuICBzcGVjID0gU3RyaW5nKHNwZWMgfHwgJycpO1xuICBiYXNlID0gU3RyaW5nKGJhc2UgfHwgJycpO1xuXG4gIGNvbnN0IHNwZWNQYXJ0cyA9IHNwZWMuc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZVBhcnRzID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIGlmIChzcGVjUGFydHMubGVuZ3RoID4gMSAmJiBzcGVjUGFydHNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgRXJyb3IoYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gIH1cbiAgaWYgKGJhc2VQYXJ0c1swXSA9PT0gJy4nIHx8IGJhc2VQYXJ0c1swXSA9PT0gJy4uJykge1xuICAgIHRocm93IEVycm9yKGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuICB9XG4gIGlmIChzcGVjUGFydHNbMF0gIT09ICcuJykge1xuICAgIHRocm93IEVycm9yKGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuICB9XG5cbiAgY29uc3Qgc29sdXRpb24gPSBbXTtcbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgc3BlY1BhcnRzKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG4gICAgICAgIGJhc2UsXG4gICAgICApfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtiYXNlLCAuLi5zb2x1dGlvbl0uam9pbignLycpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5qb2luKGpvaW4pO1xuICAgICAgIGNvbnN0IHJlbGF0aXZpemUgPSBzcGVjID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcblxuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBpZiAoIXNvbHZlKHNvbHV0aW9uLCBzcGVjLnNwbGl0KCcvJykpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFsnLicsIC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG59OyRozY9fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VCeXRlcyA9IChieXRlcywgX3NwZWNpZmllciwgX2xvY2F0aW9uLCBfcGFja2FnZUxvY2F0aW9uKSA9PiB7XG4gIC8vXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICBjb25zdCBieXRlc1ZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBidWZmZXI7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZXI6ICdieXRlcycsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlQnl0ZXMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VCeXRlcyI6WyJwYXJzZUJ5dGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHU1Ym6pEwAAqRMAAEYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMsaXNSZWFkTm93UG93ZXJzOyRozY9faW1wb3J0cyhbW1wiLi9wb3dlcnMuanNcIiwgW1tcImZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzXCIsWyRozY9fYSA9PiAoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSAkaM2PX2EpXV0sW1wiaXNSZWFkTm93UG93ZXJzXCIsWyRozY9fYSA9PiAoaXNSZWFkTm93UG93ZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyZWV6ZSwga2V5cywgY3JlYXRlLCBoYXNPd25Qcm9wZXJ0eSwgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cbiAqL1xuY29uc3Qgbm9UcmFpbGluZ1NsYXNoID0gcGF0aCA9PiB7XG4gIGNvbnN0IGwgPSBwYXRoLmxlbmd0aCAtIDE7XG4gIHJldHVybiBwYXRoW2xdID09PSAnXFxcXCcgfHwgcGF0aFtsXSA9PT0gJy8nID8gcGF0aC5zbGljZSgwLCAtMSkgOiBwYXRoO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TW9kdWxlUGF0aHMgPSAocmVhZFBvd2VycywgbG9jYXRpb24pID0+IHtcbiAgaWYgKFxuICAgIHJlYWRQb3dlcnMgJiZcbiAgICB0eXBlb2YgcmVhZFBvd2VycyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aFxuICApIHtcbiAgICBsZXQgZmlsZW5hbWUgPSBsb2NhdGlvbjtcbiAgICBsZXQgZGlybmFtZTtcbiAgICB0cnkge1xuICAgICAgZGlybmFtZSA9IG5ldyBVUkwoJy4vJywgZmlsZW5hbWUpLmhyZWY7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6IG51bGwsXG4gICAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZpbGVuYW1lID0gcmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuICAgIGRpcm5hbWUgPSBub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgZGlybmFtZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogbnVsbCxcbiAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgfTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG4gICAgICAgY29uc3Qgd3JhcCA9ICh7XG4gIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuICBjb21wYXJ0bWVudCxcbiAgcmVzb2x2ZWRJbXBvcnRzLFxuICBsb2NhdGlvbixcbiAgcmVhZFBvd2Vycyxcbn0pID0+IHtcbiAgLy9cbiAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCA9IGNyZWF0ZShcbiAgICBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUsXG4gICk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHJvbW90ZVRvTmFtZWRFeHBvcnQgPSAocHJvcCwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIGlmIChwcm9wICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlZGVmaW5lZCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBvcmlnaW5hbEV4cG9ydHMgPSBuZXcgUHJveHkobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCwge1xuICAgIHNldChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgdmFsdWUpO1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgIGlmIChoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJykpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJlZGVmaW5lZC5hZGQocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHM6IG9yaWdpbmFsRXhwb3J0cyB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlcXVpcmUgPSBpbXBvcnRTcGVjaWZpZXIgPT4ge1xuICAgIC8vXG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgbmFtZXNwYWNlO1xuXG4gICAgaWYgKCFoYXMocmVzb2x2ZWRJbXBvcnRzLCBpbXBvcnRTcGVjaWZpZXIpKSB7XG4gICAgICBpZiAoaXNSZWFkTm93UG93ZXJzKHJlYWRQb3dlcnMpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IGNvbXBhcnRtZW50LmltcG9ydE5vdyhpbXBvcnRTcGVjaWZpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BzID0gZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMocmVhZFBvd2Vycykuc29ydCgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN5bmNocm9ub3VzIHJlYWRQb3dlcnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgaW1wb3J0IG9mICR7YXNzZXJ0LnF1b3RlKGltcG9ydFNwZWNpZmllcil9OyBtaXNzaW5nIG9yIGludmFsaWQgcHJvcChzKTogJHtpbnZhbGlkUHJvcHMuam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lc3BhY2UgPSBjb21wYXJ0bWVudC5pbXBvcnROb3cocmVzb2x2ZWRJbXBvcnRzW2ltcG9ydFNwZWNpZmllcl0pO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoaGFzKG5hbWVzcGFjZSwgJ2RlZmF1bHQnKSkge1xuICAgICAgcmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlO1xuICAgIH1cbiAgfTtcbiAgaWYgKHR5cGVvZiByZWFkUG93ZXJzID09PSAnb2JqZWN0JyAmJiByZWFkUG93ZXJzLnJlcXVpcmVSZXNvbHZlKSB7XG4gICAgY29uc3QgeyByZXF1aXJlUmVzb2x2ZSB9ID0gcmVhZFBvd2VycztcbiAgICByZXF1aXJlLnJlc29sdmUgPSBmcmVlemUoKHNwZWNpZmllciwgb3B0aW9ucykgPT5cbiAgICAgIHJlcXVpcmVSZXNvbHZlKGxvY2F0aW9uLCBzcGVjaWZpZXIsIG9wdGlvbnMpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmVxdWlyZS5yZXNvbHZlID0gZnJlZXplKHNwZWNpZmllciA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCxcbiAgICAgICk7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvZGUnLCB7IHZhbHVlOiAnTU9EVUxFX05PVF9GT1VORCcgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfVxuXG4gIGZyZWV6ZShyZXF1aXJlKTtcblxuICBjb25zdCBhZnRlckV4ZWN1dGUgPSAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxFeHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7IC8vXG4gICAgY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4gPSBmaW5hbEV4cG9ydHMgIT09IG9yaWdpbmFsRXhwb3J0cztcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4pIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQgPSBmaW5hbEV4cG9ydHM7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0IHx8IHt9KSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiByZWRlZmluZWQpIHtcbiAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG1vZHVsZSxcbiAgICBtb2R1bGVFeHBvcnRzOiBvcmlnaW5hbEV4cG9ydHMsXG4gICAgYWZ0ZXJFeGVjdXRlLFxuICAgIHJlcXVpcmUsXG4gIH07XG59OyRozY9fb25jZS53cmFwKHdyYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH6/VuZEBQAARAUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUxvY2F0ZWRKc29uOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VKc29uID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBsb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICBjb25zdCBzb3VyY2UgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSwgbG9jYXRpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ2pzb24nLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VKc29uLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlSnNvbiI6WyJwYXJzZUpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk1bSVB4IAAAeCAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIiwiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlQ2pzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcFwiLFskaM2PX2EgPT4gKHdyYXAgPSAkaM2PX2EpXV0sW1wiZ2V0TW9kdWxlUGF0aHNcIixbJGjNj19hID0+IChnZXRNb2R1bGVQYXRocyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVDanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyByZWFkUG93ZXJzIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgeyBzb3VyY2UsIGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cyB9ID0gcGFyc2VMb2NhdGVkSnNvbihcbiAgICB0ZXh0LFxuICAgIGxvY2F0aW9uLFxuICApO1xuXG4gIGNvbnN0IHsgZmlsZW5hbWUsIGRpcm5hbWUgfSA9IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsIGxvY2F0aW9uKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IChtb2R1bGVFbnZpcm9ubWVudFJlY29yZCwgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgIGNvbnN0IGZ1bmN0b3IgPSBjb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG4gICAgY29uc3QgeyByZXF1aXJlLCBtb2R1bGVFeHBvcnRzLCBtb2R1bGUsIGFmdGVyRXhlY3V0ZSB9ID0gd3JhcCh7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWFkUG93ZXJzLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBmdW5jdG9yLmNhbGwoXG4gICAgICBtb2R1bGVFeHBvcnRzLFxuICAgICAgcmVxdWlyZSxcbiAgICAgIG1vZHVsZUV4cG9ydHMsXG4gICAgICBtb2R1bGUsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGRpcm5hbWUsXG4gICAgKTtcblxuICAgIGFmdGVyRXhlY3V0ZSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLWNqcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQ6IHtcbiAgICAgIGltcG9ydHMsXG4gICAgICByZWV4cG9ydHMsXG4gICAgICBleHBvcnRzLFxuICAgICAgZXhlY3V0ZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlQ2pzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiB0cnVlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbjskaM2PX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVNanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyBzb3VyY2VNYXBVcmwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBjb25zdCByZWNvcmQgPSBwYXJzZUxvY2F0ZWRKc29uKHRleHQsIGxvY2F0aW9uKTtcbiAgaWYgKHNvdXJjZU1hcFVybCkge1xuICAgIC8vXG4gICAgcmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXyArPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18gKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLW1qcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQsXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZVByZU1qcyhwYXJzZVByZU1qcyk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VQcmVNanMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVNanMiOlsicGFyc2VQcmVNanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdmA97PoEAAD6BAAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXRleHQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVRleHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VUZXh0ID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBfbG9jYXRpb24sIF9wYWNrYWdlTG9jYXRpb24pID0+IHtcbiAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbXBvcnRzID0gZnJlZXplKFtdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gZXhwb3J0cyA9PiB7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gdGV4dDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ3RleHQnLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VUZXh0KHBhcnNlVGV4dCk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VUZXh0LFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABuT8atUYAADVGAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWSA9ICdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZID0gJ3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUgPSAnYW55JztcbmNvbnN0IFBPTElDWV9GSUVMRFNfTE9PS1VQID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ2J1aWx0aW5zJyxcbiAgJ2dsb2JhbHMnLFxuICAncGFja2FnZXMnLFxuXSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcG9saWN5TG9va3VwSGVscGVyID0gKHBhY2thZ2VQb2xpY3ksIGZpZWxkLCBpdGVtTmFtZSkgPT4ge1xuICBpZiAoIVBPTElDWV9GSUVMRFNfTE9PS1VQLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGZpZWxkICR7cShmaWVsZCl9YCk7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBwYWNrYWdlUG9saWN5ICE9PSAnb2JqZWN0JyB8fFxuICAgIHBhY2thZ2VQb2xpY3kgPT09IG51bGwgfHxcbiAgICAhcGFja2FnZVBvbGljeVtmaWVsZF1cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VQb2xpY3lbZmllbGRdID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBwYWNrYWdlUG9saWN5W2ZpZWxkXVxuICApO1xuICBpZiAoaXRlbU5hbWUgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVbaXRlbU5hbWVdO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbiAgICAgICBjb25zdCBpc0FsbG93aW5nRXZlcnl0aGluZyA9IHBvbGljeVZhbHVlID0+XG4gIHBvbGljeVZhbHVlID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuaXNBbGxvd2luZ0V2ZXJ5dGhpbmcoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcpO1xuICAgICAgIGNvbnN0IGlzQXR0ZW51YXRpb25EZWZpbml0aW9uID0gYWxsZWdlZERlZmluaXRpb24gPT4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICAoYWxsZWdlZERlZmluaXRpb24gJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0gPT09ICdzdHJpbmcnKSB8fCAvL1xuICAgICAgaXNBcnJheShhbGxlZ2VkRGVmaW5pdGlvbikgIC8vXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbiAgICAgICBjb25zdCBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSBhdHRlbnVhdGlvbkRlZmluaXRpb24gPT4ge1xuICBpZiAoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGF0dGVudWF0aW9uICR7cShcbiAgICAgICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgICAgKX0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgLFxuICAgICk7XG4gIH1cbiAgaWYgKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5TmFtZTogJzxkZWZhdWx0IGF0dGVudWF0b3I+JyxcbiAgICAgIHNwZWNpZmllcjogbnVsbCxcbiAgICAgIHBhcmFtczogYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgc3BlY2lmaWVyOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgcGFyYW1zOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9QQVJBTVNfS0VZXSxcbiAgICB9O1xuICB9XG59O1xuXG4vL1xuJGjNj19vbmNlLmdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24pO2NvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuICBpZiAodHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IGl0ZW0gPT09IG51bGwgfHwgaXNBcnJheShpdGVtKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZW50cmllcyhpdGVtKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PiBwcmVkaWNhdGUodmFsdWUsIGtleSkpO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNCb29sZWFuID0gaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ2Jvb2xlYW4nO1xuXG4vL1xuY29uc3QgcHJlZGljYXRlT3IgPVxuICAoLi4ucHJlZGljYXRlcykgPT5cbiAgaXRlbSA9PlxuICAgIHByZWRpY2F0ZXMuc29tZShwID0+IHAoaXRlbSkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNQb2xpY3lJdGVtID0gaXRlbSA9PlxuICBpdGVtID09PSB1bmRlZmluZWQgfHxcbiAgaXRlbSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFIHx8XG4gIGlzUmVjb3JkT2YoaXRlbSwgaXNCb29sZWFuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYWNrYWdlUG9saWN5ID0gKGFsbGVnZWRQYWNrYWdlUG9saWN5LCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaW5VcmwgPSB1cmwgPyBgIGluICR7cSh1cmwpfWAgOiAnJztcblxuICBjb25zdCBwYWNrYWdlUG9saWN5ID0gT2JqZWN0KGFsbGVnZWRQYWNrYWdlUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSBwYWNrYWdlUG9saWN5ICYmICFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gLFxuICApO1xuICBjb25zdCB7XG4gICAgcGFja2FnZXMsXG4gICAgYnVpbHRpbnMsXG4gICAgZ2xvYmFscyxcbiAgICBub0dsb2JhbEZyZWV6ZSxcbiAgICBkZWZhdWx0QXR0ZW51YXRvcjogX2lnbm9yZSwgLy9cbiAgICAvL1xuICAgIG9wdGlvbnMsIC8vXG4gICAgLi4uZXh0cmFcbiAgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChwYWNrYWdlUG9saWN5KTtcblxuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9JHtpblVybH1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICBub0dsb2JhbEZyZWV6ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBub0dsb2JhbEZyZWV6ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGAke3BhdGh9Lm5vR2xvYmFsRnJlZXplIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHtxKHtcbiAgICAgIG5vR2xvYmFsRnJlZXplLFxuICAgIH0pfSR7aW5Vcmx9YCxcbiAgKTtcblxuICBpc1BvbGljeUl0ZW0ocGFja2FnZXMpIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbiAgICAgICAgcGFja2FnZXMsXG4gICAgICB9KX0ke2luVXJsfWAsXG4gICAgKTtcblxuICBpc1BvbGljeUl0ZW0oZ2xvYmFscykgfHxcbiAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihnbG9iYWxzKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxuICAgICAgICB7XG4gICAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgfSxcbiAgICAgICl9JHtpblVybH1gLFxuICAgICk7XG5cbiAgaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKSB8fFxuICAgIGlzUmVjb3JkT2YoYnVpbHRpbnMsIHByZWRpY2F0ZU9yKGlzQm9vbGVhbiwgaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuICAgICAgICBidWlsdGlucyxcbiAgICAgIH0pfSR7aW5Vcmx9YCxcbiAgICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRQYWNrYWdlUG9saWN5KGFzc2VydFBhY2thZ2VQb2xpY3kpO1xuICAgICAgIGNvbnN0IGFzc2VydFBvbGljeSA9IGFsbGVnZWRQb2xpY3kgPT4ge1xuICBpZiAoYWxsZWdlZFBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBvbGljeSA9IE9iamVjdChhbGxlZ2VkUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQb2xpY3kgPT09IHBvbGljeSAmJiAhQXJyYXkuaXNBcnJheShwb2xpY3kpLFxuICAgIGBwb2xpY3kgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQb2xpY3l9YCxcbiAgKTtcblxuICBjb25zdCB7IHJlc291cmNlcywgZW50cnksIGRlZmF1bHRBdHRlbnVhdG9yLCAuLi5leHRyYSB9ID0gcG9saWN5O1xuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGBwb2xpY3kgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICB0eXBlb2YgcmVzb3VyY2VzID09PSAnb2JqZWN0JyAmJiByZXNvdXJjZXMgIT09IG51bGwgJiYgIWlzQXJyYXkocmVzb3VyY2VzKSxcbiAgICBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWAsXG4gICk7XG4gIGFzc2VydChcbiAgICAhZGVmYXVsdEF0dGVudWF0b3IgfHwgdHlwZW9mIGRlZmF1bHRBdHRlbnVhdG9yID09PSAnc3RyaW5nJyxcbiAgICBgcG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZGVmYXVsdEF0dGVudWF0b3IpfWAsXG4gICk7XG5cbiAgYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgIGFzc2VydFBhY2thZ2VQb2xpY3kodmFsdWUsIGBwb2xpY3kucmVzb3VyY2VzW1wiJHtrZXl9XCJdYCk7XG4gIH1cbn07JGjNj19vbmNlLmFzc2VydFBvbGljeShhc3NlcnRQb2xpY3kpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPE/zSY+KgAAPioAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLFskaM2PX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRozY9fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLFskaM2PX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjNj19hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsWyRozY9fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaM2PX2EpXV0sW1wicG9saWN5TG9va3VwSGVscGVyXCIsWyRozY9fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGNyZWF0ZSwgZW50cmllcywgdmFsdWVzLCBhc3NpZ24sIGZyZWV6ZSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID1cbiAgT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICc8QVRURU5VQVRPUlM+JztcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpO1xuY29uc3Qgc2VsZWN0aXZlQ29weSA9IChmcm9tLCB0bywgbGlzdCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcHJvcHM7XG4gIGlmICghbGlzdCkge1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhmcm9tKTtcbiAgICBwcm9wcyA9IG93bktleXMoZnJvbSkuZmlsdGVyKGtleSA9PiBkZXNjc1trZXldLmVudW1lcmFibGUpO1xuICB9IGVsc2Uge1xuICAgIHByb3BzID0gbGlzdDtcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJvcHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3Qga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgIC8vXG4gICAgLy9cbiAgICB0b1trZXldID0gZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0bztcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnMgPSAoYXR0ZW51YXRvcnMsIHBvbGljeUZyYWdtZW50KSA9PiB7XG4gIGlmICgnYXR0ZW51YXRlJyBpbiBwb2xpY3lGcmFnbWVudCkge1xuICAgIGF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiAgfVxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyhwb2xpY3lGcmFnbWVudCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXRlY3RBdHRlbnVhdG9ycyA9IHBvbGljeSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmICghYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSkge1xuICAgIGNvbnN0IGF0dGVudWF0b3JzID0gW107XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcikge1xuICAgICAgYXR0ZW51YXRvcnMucHVzaChwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IpO1xuICAgIH1cbiAgICBjb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMsIHBvbGljeSk7XG4gICAgYXR0ZW51YXRvcnNDYWNoZS5zZXQocG9saWN5LCBhdHRlbnVhdG9ycyk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0b3JzQ2FjaGUuZ2V0KHBvbGljeSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lID0gKHsgaXNFbnRyeSA9IGZhbHNlLCBuYW1lLCBwYXRoIH0pID0+IHtcbiAgaWYgKGlzRW50cnkpIHtcbiAgICB0aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gIH1cbiAgaWYgKG5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oJz4nKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5ID0gKG5hbWluZ0tpdCwgcGFja2FnZVBvbGljeSkgPT4ge1xuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICAvL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjYW5vbmljYWxOYW1lID0gZ2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG4gIHJldHVybiAhIXBvbGljeUxvb2t1cEhlbHBlcihwYWNrYWdlUG9saWN5LCAncGFja2FnZXMnLCBjYW5vbmljYWxOYW1lKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcbiAgICAgICBjb25zdCBnZXRQb2xpY3lGb3JQYWNrYWdlID0gKG5hbWluZ0tpdCwgcG9saWN5KSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICByZXR1cm4gcG9saWN5LmVudHJ5O1xuICB9XG4gIGNvbnN0IGNhbm9uaWNhbE5hbWUgPSBnZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbiAgaWYgKGNhbm9uaWNhbE5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlZmF1bHRBdHRlbnVhdG9yOiBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsXG4gICAgICBwYWNrYWdlczogJ2FueScsXG4gICAgfTtcbiAgfVxuICBpZiAocG9saWN5LnJlc291cmNlcyAmJiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJldHVybiBjcmVhdGUobnVsbCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcbmNvbnN0IGdldEdsb2JhbHNMaXN0ID0gcGFja2FnZVBvbGljeSA9PiB7XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCAhcGFja2FnZVBvbGljeS5nbG9iYWxzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscylcbiAgICAuZmlsdGVyKChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAubWFwKChba2V5LCBfdnZhbHVlXSkgPT4ga2V5KTtcbn07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SID0gJ2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1IgPSAnYXR0ZW51YXRlTW9kdWxlJztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uID0gYXN5bmMgKFxuICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gIGF0dGVudWF0b3JzUHJvdmlkZXIsXG4gIGF0dGVudWF0b3JFeHBvcnROYW1lLFxuKSA9PiB7XG4gIGlmICghYXR0ZW51YXRvcnNQcm92aWRlcikge1xuICAgIHRocm93IEVycm9yKGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuICB9XG4gIGNvbnN0IHsgc3BlY2lmaWVyLCBwYXJhbXMsIGRpc3BsYXlOYW1lIH0gPSBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICApO1xuICBjb25zdCBhdHRlbnVhdG9yID0gYXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbiAgaWYgKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEF0dGVudWF0b3IgJHtxKGRpc3BsYXlOYW1lKX0gZG9lcyBub3QgZXhwb3J0ICR7cShhdHRlbnVhdG9yRXhwb3J0TmFtZSl9YCxcbiAgICApO1xuICB9XG4gIC8vXG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvciwgcGFyYW1zKTtcbiAgcmV0dXJuIGF0dGVudWF0ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAoXG4gIGNvbXBhcnRtZW50cyxcbiAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbXBvcnRBdHRlbnVhdG9yO1xuICBsZXQgZGVmYXVsdEF0dGVudWF0b3I7XG4gIC8vXG4gIC8vXG4gIGlmICghY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0pIHtcbiAgICBpbXBvcnRBdHRlbnVhdG9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoYE5vIGF0dGVudWF0b3JzIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlZmF1bHRBdHRlbnVhdG9yID1cbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGltcG9ydEF0dGVudWF0b3IgPSBhc3luYyBhdHRlbnVhdG9yU3BlY2lmaWVyID0+IHtcbiAgICAgIGlmICghYXR0ZW51YXRvclNwZWNpZmllcikge1xuICAgICAgICBpZiAoIWRlZmF1bHRBdHRlbnVhdG9yKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW51YXRvclNwZWNpZmllciA9IGRlZmF1bHRBdHRlbnVhdG9yO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi8gKGF0dGVudWF0b3JTcGVjaWZpZXIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuYW1lc3BhY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW1wb3J0OiBpbXBvcnRBdHRlbnVhdG9yLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbiAgYXR0ZW51YXRvcnMsXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgZ2xvYmFsVGhpcyxcbiAgZ2xvYmFscyxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIEdMT0JBTF9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cbiAgLy9cbiAgLy9cblxuICAvL1xuXG4gIGNvbnN0IHJlc3VsdCA9IC8qICAgICAgICovIGF0dGVudWF0ZShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIGFzc2lnbihnbG9iYWxUaGlzLCByZXN1bHQpO1xuICB9XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVHbG9iYWxzID0gKFxuICBnbG9iYWxUaGlzLFxuICBnbG9iYWxzLFxuICBwYWNrYWdlUG9saWN5LFxuICBhdHRlbnVhdG9ycyxcbiAgcGVuZGluZ0pvYnMsXG4gIG5hbWUgPSAnPHVua25vd24+JyxcbikgPT4ge1xuICBsZXQgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0ID0gKCkgPT4ge1xuICAgIGZyZWV6ZShnbG9iYWxUaGlzKTtcbiAgfTtcbiAgaWYgKHBhY2thZ2VQb2xpY3kgJiYgcGFja2FnZVBvbGljeS5ub0dsb2JhbEZyZWV6ZSkge1xuICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCA9ICgpID0+IHt9O1xuICB9XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCBpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKSB7XG4gICAgc2VsZWN0aXZlQ29weShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpIHtcbiAgICBjb25zdCBhdHRlbnVhdGlvbkRlZmluaXRpb24gPSBwYWNrYWdlUG9saWN5Lmdsb2JhbHM7XG4gICAgY29uc3QgeyBkaXNwbGF5TmFtZSB9ID0gZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG4gICAgY29uc3QgYXR0ZW51YXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkgLy9cbiAgICAgIC50aGVuKCgpID0+XG4gICAgICAgIGF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnRoZW4oZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0LCBlcnJvciA9PiB7XG4gICAgICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3Igd2hpbGUgYXR0ZW51YXRpbmcgZ2xvYmFscyBmb3IgJHtxKG5hbWUpfSB3aXRoICR7cShcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgICAgICl9OiAke3EoZXJyb3IubWVzc2FnZSl9YCAgLy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHBlbmRpbmdKb2JzLnB1c2goYXR0ZW51YXRpb25Qcm9taXNlKTtcblxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsaXN0ID0gZ2V0R2xvYmFsc0xpc3QocGFja2FnZVBvbGljeSk7XG4gIHNlbGVjdGl2ZUNvcHkoZ2xvYmFscywgZ2xvYmFsVGhpcywgbGlzdCk7XG4gIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuYXR0ZW51YXRlR2xvYmFscyhhdHRlbnVhdGVHbG9iYWxzKTtcbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5ID0gZXJyb3JIaW50ID0+IHtcbiAgaWYgKCFlcnJvckhpbnQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIGAgKGluZm86ICR7ZXJyb3JIaW50fSlgO1xufTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZW5mb3JjZU1vZHVsZVBvbGljeSA9IChcbiAgc3BlY2lmaWVyLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gIHsgZXhpdCwgZXJyb3JIaW50IH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHBvbGljeSwgbW9kdWxlcywgbGFiZWwgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgaWYgKCFwb2xpY3kpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWV4aXQpIHtcbiAgICBpZiAoIW1vZHVsZXNbc3BlY2lmaWVyXSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG4gICAgICAgICAgcG9saWN5LnBhY2thZ2VzLFxuICAgICAgICApfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCAnYnVpbHRpbnMnLCBzcGVjaWZpZXIpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmVuZm9yY2VNb2R1bGVQb2xpY3koZW5mb3JjZU1vZHVsZVBvbGljeSk7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVNb2R1bGUoe1xuICBhdHRlbnVhdG9ycyxcbiAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIE1PRFVMRV9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgaW1wb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuaW1wb3J0cyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXhwb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhwb3J0cyxcbiAgICBleGVjdXRlOiAobW9kdWxlRXhwb3J0cywgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgICAgY29uc3QgbnMgPSB7fTtcbiAgICAgIG9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsIGNvbXBhcnRtZW50LCByZXNvbHZlZEltcG9ydHMpO1xuICAgICAgY29uc3QgYXR0ZW51YXRlZCA9IGF0dGVudWF0ZShucyk7XG4gICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQgPSBhdHRlbnVhdGVkO1xuICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIGF0dGVudWF0ZWQpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVNb2R1bGVIb29rID0gYXN5bmMgKFxuICBzcGVjaWZpZXIsXG4gIG9yaWdpbmFsTW9kdWxlUmVjb3JkLFxuICBwb2xpY3ksXG4gIGF0dGVudWF0b3JzLFxuKSA9PiB7XG4gIGNvbnN0IHBvbGljeVZhbHVlID0gcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwgJ2J1aWx0aW5zJywgc3BlY2lmaWVyKTtcbiAgaWYgKCFwb2xpY3kgfHwgcG9saWN5VmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxNb2R1bGVSZWNvcmQ7XG4gIH1cblxuICBpZiAoIXBvbGljeVZhbHVlKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0ZU1vZHVsZSh7XG4gICAgYXR0ZW51YXRvcnMsXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uOiBwb2xpY3lWYWx1ZSxcbiAgICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbiAgfSk7XG59OyRozY9fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAr2h7pdwIAADcCAAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiLCJpc1JlYWROb3dQb3dlcnMiLCJ1bnBhY2tSZWFkUG93ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW0gPSBhc3luYyBwYXRoID0+IHBhdGg7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgdW5wYWNrUmVhZFBvd2VycyA9IHBvd2VycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG1heWJlUmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGNhbm9uaWNhbDtcblxuICBpZiAodHlwZW9mIHBvd2VycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWQgPSBwb3dlcnM7XG4gIH0gZWxzZSB7XG4gICAgKHsgcmVhZCwgbWF5YmVSZWFkLCBjYW5vbmljYWwgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocG93ZXJzKSk7XG4gIH1cblxuICBpZiAoY2Fub25pY2FsID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5vbmljYWwgPSBjYW5vbmljYWxTaGltO1xuICB9XG5cbiAgaWYgKG1heWJlUmVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbWF5YmVSZWFkID0gcGF0aCA9PlxuICAgICAgLyogICAgICAgICAgICAgICAgICovIChyZWFkKShwYXRoKS5jYXRjaChfZXJyb3IgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucG93ZXJzLFxuICAgIHJlYWQsXG4gICAgbWF5YmVSZWFkLFxuICAgIGNhbm9uaWNhbCxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudW5wYWNrUmVhZFBvd2Vycyh1bnBhY2tSZWFkUG93ZXJzKTtcbmNvbnN0IHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzID0gZnJlZXplKFxuICAvKiAgICAgICAgICAgICAgICAqLyAoWydmaWxlVVJMVG9QYXRoJywgJ2lzQWJzb2x1dGUnLCAnbWF5YmVSZWFkTm93J10pLFxuKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNSZWFkTm93UG93ZXJzID0gdmFsdWUgPT5cbiAgQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMuZXZlcnkoXG4gICAgICAgIHByb3AgPT4gcHJvcCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbcHJvcF0gPT09ICdmdW5jdGlvbicsXG4gICAgICApLFxuICApO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaXNSZWFkTm93UG93ZXJzKGlzUmVhZE5vd1Bvd2Vycyk7XG4gICAgICAgY29uc3QgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSB2YWx1ZSA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFsuLi5yZXF1aXJlZFJlYWROb3dQb3dlcnNQcm9wc107XG4gIH1cbiAgcmV0dXJuIHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzLmZpbHRlcihcbiAgICBwcm9wID0+ICEocHJvcCBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3BdICE9PSAnZnVuY3Rpb24nLFxuICApO1xufTskaM2PX29uY2UuZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl0sImlzUmVhZE5vd1Bvd2VycyI6WyJpc1JlYWROb3dQb3dlcnMiXSwiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3R5cGVzLWV4dGVybmFsLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSioamiAQAAogEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAusIkdug8AALoPAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cblxuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8vXG4vL1xuY29uc3QgdW5jdXJyeVRoaXMgPVxuICBmbiA9PlxuICAocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG4gICAgYXBwbHkoZm4sIHJlY2VpdmVyLCBhcmdzKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXMgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsID0gKGxpdGVyYWxzLCAuLi5hcmdzKSA9PiB7XG4gIGxldCBtc2cgPSBsaXRlcmFsc1swXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbXNnID0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2kgKyAxXX1gO1xuICB9XG4gIHRocm93IEVycm9yKG1zZyk7XG59O1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVudmlyb25tZW50Q2FwdG9yID0gKGFHbG9iYWwsIGRyb3BOYW1lcyA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9IFtdO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAoXG4gICAgb3B0aW9uTmFtZSxcbiAgICBkZWZhdWx0U2V0dGluZyxcbiAgICBvcHRPdGhlclZhbHVlcyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgdHlwZW9mIG9wdGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgICAgKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHNldHRpbmcgPSBkZWZhdWx0U2V0dGluZztcbiAgICBjb25zdCBnbG9iYWxQcm9jZXNzID0gYUdsb2JhbC5wcm9jZXNzIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBnbG9iYWxFbnYgPVxuICAgICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8vXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICBvcHRpb25OYW1lLFxuICAgICAgICAgICl9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbiAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBzZXR0aW5nID09PSBkZWZhdWx0U2V0dGluZyB8fFxuICAgICAgYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcywgc2V0dGluZykgfHxcbiAgICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgKX0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLCAuLi5vcHRPdGhlclZhbHVlc10pfWA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEwL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmIChnbG9iYWxBc3NlcnQgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCxcbiAgKTtcbn1cblxuY29uc3QgbWlzc2luZyA9IC8qICAgICAgICAgICAgICAgICovIChbXG4gICd0eXBlb2YnLFxuICAnZXJyb3InLFxuICAnZmFpbCcsXG4gICdlcXVhbCcsXG4gICdzdHJpbmcnLFxuICAnbm90ZScsXG4gICdkZXRhaWxzJyxcbiAgJ0ZhaWwnLFxuICAncXVvdGUnLFxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAnbWFrZUFzc2VydCcsXG5dKS5maWx0ZXIobmFtZSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICcsXG4gICAgKX1gLFxuICApO1xufVxuXG4vL1xuLy9cbi8vXG5jb25zdCB7XG4gIGJhcmUsXG4gIGRldGFpbHM6IHJlZGFjdGVkLFxuICBlcnJvcjogbWFrZUVycm9yLFxuICBGYWlsOiB0aHJvd1JlZGFjdGVkLFxuICBtYWtlQXNzZXJ0OiBfb21pdHRlZE1ha2VBc3NlcnQsXG4gIG5vdGUsXG4gIHF1b3RlLFxuICAuLi5hc3NlcnRpb25zXG59ID0gZ2xvYmFsQXNzZXJ0O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtjb25zdCBhc3NlcnQ9KHZhbHVlLG9wdERldGFpbHMsZXJyQ29udHJ1Y3RvcixvcHRpb25zKT0+XG4gIGdsb2JhbEFzc2VydCh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsIGFzc2VydGlvbnMpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMmxgxkbFgAAGxYAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKlxuXG4gKi9cblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcyAhPT0gcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBtYWtlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBYYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICAgICl9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ0FycmF5KTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gSGFuZGxlZFByb21pc2UuZ2V0KHgsIHByb3ApLFxuICB9KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG9ialRhcmdldCA9IGZyZWV6ZSh7IF9fcHJvdG9fXzogbnVsbCB9KTtcblxuLypcblxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgeCA9PiBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcbiAgICAgIHtcbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIC8vXG4gICAgICAgIGdldDogeCA9PiBuZXcgUHJveHkob2JqVGFyZ2V0LCBtYWtlRUdldFByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgZ2V0UHJvdG90eXBlT2YsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZiA9IHNwZWNpbWVuID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiBPYmplY3QodmFsKSA9PT0gdmFsO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkID0gKGEsIGIpID0+IHtcbiAgaWYgKHR5cGVvZiBhID09PSB0eXBlb2YgYikge1xuICAgIGNvbnN0IGxlZnQgPSBTdHJpbmcoYSk7XG4gICAgY29uc3QgcmlnaHQgPSBTdHJpbmcoYik7XG4gICAgLy9cbiAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdzeW1ib2wnKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGFzc2VydCh0eXBlb2YgYSA9PT0gJ3N0cmluZycpO1xuICBhc3NlcnQodHlwZW9mIGIgPT09ICdzeW1ib2wnKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLy9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLy9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8vXG4vL1xuJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtmcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseUZ1bmN0aW9uID0gKHJlY2lwaWVudCwgYXJncykgPT4ge1xuICB0eXBlb2YgcmVjaXBpZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ3MpO1xuICB9XG4gIGlmIChyZWNpcGllbnQgPT09IHVuZGVmaW5lZCB8fCByZWNpcGllbnQgPT09IG51bGwpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZ0eXBlID0gbnR5cGVvZihmbik7XG4gIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG4gICAgICBmdHlwZSxcbiAgICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLy9cbiAgICBkZWJ1Z2dlcjsgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuICAgICAgIGNvbnN0IGxvY2FsR2V0ID0gKHQsIGtleSkgPT4gdFtrZXldOyRozY9fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB5M+y4PA8AADwPAAA1AAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGhhc093biwgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZCA9IHZhbCA9PlxuICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjbGFzc0JQc1t0YWddID0gY291bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrcG9pbnRzID0gbmV3QnJlYWtwb2ludHM7XG4gICAgYnJlYWtwb2ludHNUYWJsZSA9IG5ld0JyZWFrcG9pbnRzVGFibGU7XG4gIH07XG4gIGZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2hvdWxkQnJlYWtwb2ludCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUpID0+IHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpgMOzngoAAJ4KAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8vXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLy9cbi8vXG5jb25zdCBFTkFCTEVEID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pID09PSAnZW5hYmxlZCc7XG5cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjQuMC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCduYW1lJyx7dmFsdWU6XCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjNj19vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBjb21wYXJ0bWVudE9wdGlvbnMgPSAoLi4uYXJncykgPT4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKFxuICAgIGFyZ3MubGVuZ3RoID09PSAxICYmXG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmXG4gICAgYXJnc1swXSAhPT0gbnVsbCAmJlxuICAgICdfX29wdGlvbnNfXycgaW4gYXJnc1swXVxuICApIHtcbiAgICBjb25zdCB7IF9fb3B0aW9uc19fLCAuLi5vcHRpb25zIH0gPSBhcmdzWzBdO1xuICAgIGFzc2VydChcbiAgICAgIF9fb3B0aW9uc19fID09PSB0cnVlLFxuICAgICAgYENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG9ubHkgc3VwcG9ydHMgdHJ1ZSBfX29wdGlvbnNfXyBzaWdpbCwgZ290ICR7X19vcHRpb25zX199YCxcbiAgICApO1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtcbiAgICAgIGdsb2JhbHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh7fSksXG4gICAgICBtb2R1bGVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICAgIG9wdGlvbnMgPSB7fSxcbiAgICBdID0gYXJncztcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBvcHRpb25zLm1vZHVsZXMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgQ29tcGFydG1lbnQgY29uc3RydWN0b3IgbXVzdCByZWNlaXZlIGVpdGhlciBhIG1vZHVsZSBtYXAgYXJndW1lbnQgb3IgbW9kdWxlcyBvcHRpb24sIG5vdCBib3RoYCxcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG9wdGlvbnMuZ2xvYmFscyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBDb21wYXJ0bWVudCBjb25zdHJ1Y3RvciBtdXN0IHJlY2VpdmUgZWl0aGVyIGdsb2JhbHMgYXJndW1lbnQgb3Igb3B0aW9uLCBub3QgYm90aGAsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgIH07XG4gIH1cbn07XG5cbiAgICAgICBmdW5jdGlvbiB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbiAgT2xkQ29tcGFydG1lbnQsXG4gIGluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbiAgaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzLFxuKSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE5ld0NvbXBhcnRtZW50ID0gZnVuY3Rpb24gQ29tcGFydG1lbnQoLi4uYXJncykge1xuICAgIGNvbnN0IHsgdHJhbnNmb3Jtczogb2xkVHJhbnNmb3JtcyA9IFtdLCAuLi5vdGhlck9wdGlvbnMgfSA9XG4gICAgICBjb21wYXJ0bWVudE9wdGlvbnMoLi4uYXJncyk7XG4gICAgY29uc3QgbmV3VHJhbnNmb3JtcyA9IFsuLi5vbGRUcmFuc2Zvcm1zLCAuLi5pbmVzY2FwYWJsZVRyYW5zZm9ybXNdO1xuICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7XG4gICAgICAuLi5vdGhlck9wdGlvbnMsXG4gICAgICB0cmFuc2Zvcm1zOiBuZXdUcmFuc2Zvcm1zLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKG5ldy50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIHRocm93IEVycm9yKCdDb21wYXJ0bWVudCBtdXN0IGJlIGNhbGxlZCBhcyBhIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgLy9cblxuICAgIGNvbnN0IGMgPSBSZWZsZWN0LmNvbnN0cnVjdChPbGRDb21wYXJ0bWVudCwgW25ld09wdGlvbnNdLCBuZXcudGFyZ2V0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSBOZXdDb21wYXJ0bWVudDtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBSZWZsZWN0Lm93bktleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcywgcHJvcCwge1xuICAgICAgICB2YWx1ZTogaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgLy9cbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjO1xuICB9O1xuXG4gIC8vXG4gIE5ld0NvbXBhcnRtZW50LnByb3RvdHlwZSA9IE9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIHJldHVybiBOZXdDb21wYXJ0bWVudDtcbn1cblxuLy9cbi8vXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrtsVhihYAAIoWAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2Vycm9ycyIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIiwiaW1wb3J0QnVuZGxlIiwidHlwZWRJbXBvcnRCdW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUFyY2hpdmUsZGVjb2RlQmFzZTY0LEZhaWwsd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLFskaM2PX2EgPT4gKHBhcnNlQXJjaGl2ZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIixbJGjNj19hID0+ICh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydEJ1bmRsZSwnbmFtZScse3ZhbHVlOlwiaW1wb3J0QnVuZGxlXCJ9KTskaM2PX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLy9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBpbXBvcnRCdW5kbGUoYnVuZGxlLCBvcHRpb25zID0ge30sIHBvd2VycyA9IHt9KSB7XG4gIGF3YWl0IG51bGw7XG4gIGNvbnN0IHtcbiAgICBidW5kbGVVcmwgPSB1bmRlZmluZWQsXG4gICAgZmlsZVByZWZpeCxcbiAgICBlbmRvd21lbnRzOiBvcHRFbmRvd21lbnRzID0ge30sXG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMgPSB7fSxcbiAgICBleHBlY3RlZFNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtcbiAgICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gIH0gPSBwb3dlcnM7XG4gIGNvbnN0IGVuZG93bWVudHMgPSB7XG4gICAgVGV4dEVuY29kZXIsXG4gICAgVGV4dERlY29kZXIsXG4gICAgVVJMOiBnbG9iYWxUaGlzLlVSTCwgLy9cbiAgICBCYXNlNjQ6IGdsb2JhbFRoaXMuQmFzZTY0LCAvL1xuICAgIGF0b2I6IGdsb2JhbFRoaXMuYXRvYixcbiAgICBidG9hOiBnbG9iYWxUaGlzLmJ0b2EsXG4gICAgLi4ub3B0RW5kb3dtZW50cyxcbiAgfTtcblxuICBsZXQgQ29tcGFydG1lbnRUb1VzZSA9IENvbXBhcnRtZW50O1xuICBpZiAoXG4gICAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aCB8fFxuICAgIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykubGVuZ3RoXG4gICkge1xuICAgIC8vXG4gICAgQ29tcGFydG1lbnRUb1VzZSA9IHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuICAgICAgQ29tcGFydG1lbnQsXG4gICAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG4gICAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMsXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb21wYXJ0bWVudDtcblxuICBhc3NlcnQoJ21vZHVsZUZvcm1hdCcgaW4gYnVuZGxlKTtcbiAgY29uc3QgeyBtb2R1bGVGb3JtYXQgfSA9IGJ1bmRsZTtcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9aaXBCYXNlNjQnKSB7XG4gICAgYXNzZXJ0KCdlbmRvWmlwQmFzZTY0JyBpbiBidW5kbGUpO1xuICAgIGNvbnN0IHsgZW5kb1ppcEJhc2U2NCB9ID0gYnVuZGxlO1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0KGVuZG9aaXBCYXNlNjQpO1xuICAgIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBwYXJzZUFyY2hpdmUoYnl0ZXMsIGJ1bmRsZVVybCwge1xuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgIH0pO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gYXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuICAgICAgZ2xvYmFsczogZW5kb3dtZW50cyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXzogdHJhbnNmb3JtcyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFRvVXNlLFxuICAgIH0pO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICd0ZXN0Jykge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBidW5kbGVbU3ltYm9sLmZvcignZXhwb3J0cycpXTtcbiAgICBpZiAoZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgaW1wb3J0IGJ1bmRsZSB3aXRoIG1vZHVsZUZvcm1hdCBcInRlc3RcIiB0aGF0IGxhY2tzIGFuIHN5bWJvbC1uYW1lZCBwcm9wZXJ0eSBAZXhwb3J0cyBhbmQgaGFzIGxpa2VseSBiZWVuIHBhcnRpYWxseSB0cmFuc3BvcnRlZCB2aWEgSlNPTiBvciBldmVudHVhbC1zZW5kJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIE9iamVjdC5zZWFsKFxuICAgICAgT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFtcbiAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhleHBvcnRzKSlcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW25hbWUsIGRlc2NyaXB0b3JdKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IFtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleHBvcnRzW25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJyxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnQoJ3NvdXJjZScgaW4gYnVuZGxlKTtcbiAgbGV0IHsgc291cmNlIH0gPSBidW5kbGU7XG4gIGNvbnN0IHNvdXJjZU1hcCA9ICdzb3VyY2VNYXAnIGluIGJ1bmRsZSA/IGJ1bmRsZS5zb3VyY2VNYXAgOiAnJztcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2dldEV4cG9ydCcpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc291cmNlID0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB9YDtcbiAgfSBlbHNlIGlmIChtb2R1bGVGb3JtYXQgPT09ICduZXN0ZWRFdmFsdWF0ZScpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGVuZG93bWVudHMubmVzdGVkRXZhbHVhdGUgPSBzcmMgPT4gY29tcGFydG1lbnQuZXZhbHVhdGUoc3JjKTtcbiAgICBzb3VyY2UgPSBgKCR7c291cmNlfSlcXG4ke3NvdXJjZU1hcH1gO1xuICB9IGVsc2UgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9TY3JpcHQnKSB7XG4gICAgLy9cbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuICB9XG5cbiAgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLCB7fSwgeyB0cmFuc2Zvcm1zIH0pO1xuICBoYXJkZW4oY29tcGFydG1lbnQuZ2xvYmFsVGhpcyk7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvU2NyaXB0Jykge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgY29uc3QgbmFtZXNwYWNlID0gcmVzdWx0KGZpbGVQcmVmaXgpO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHlwZWRJbXBvcnRCdW5kbGUgPSBpbXBvcnRCdW5kbGU7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50eXBlZEltcG9ydEJ1bmRsZSh0eXBlZEltcG9ydEJ1bmRsZSk7XG4gICAgICAgY29uc3QgYnVuZGxlVGVzdEV4cG9ydHMgPSBleHBvcnRzID0+IHtcbiAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXhwb3J0cykuZmlsdGVyKFxuICAgIG5hbWUgPT4gbmFtZSAhPT0gU3ltYm9sLnRvU3RyaW5nVGFnLFxuICApO1xuICBzeW1ib2xzLmxlbmd0aCA+IDAgJiZcbiAgICBGYWlsYGV4cG9ydHMgbXVzdCBub3QgaGF2ZSBzeW1ib2wtbmFtZWQgcHJvcGVydGllcywgZ290OiAke3N5bWJvbHMubWFwKFN0cmluZykuam9pbignLCAnKX1gO1xuICByZXR1cm4ge1xuICAgIG1vZHVsZUZvcm1hdDogJ3Rlc3QnLFxuICAgIFtTeW1ib2wuZm9yKCdleHBvcnRzJyldOiBleHBvcnRzLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovJGjNj19vbmNlLmJ1bmRsZVRlc3RFeHBvcnRzKGJ1bmRsZVRlc3RFeHBvcnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImltcG9ydEJ1bmRsZSI6WyJpbXBvcnRCdW5kbGUiXSwidHlwZWRJbXBvcnRCdW5kbGUiOlsidHlwZWRJbXBvcnRCdW5kbGUiXSwiYnVuZGxlVGVzdEV4cG9ydHMiOlsiYnVuZGxlVGVzdEV4cG9ydHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALdVQBoIHAACCBwAAHQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJ0cml2aWFsQ29tcGFyYXRvciIsInRyaXZpYWxDb21wYXJhdG9yIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJV8ZZmaTwAAmk8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vL1xuY29uc3QgckMwID0gL1tcXHgwMC1cXHgxRl0vO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldFN1ZmZpeCA9IChzdHIsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKGluZGV4KSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZE5hbWVzID0gcmVjb3JkID0+XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGhhcmRlbigvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyZWNvcmQpKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcmVjb3JkVmFsdWVzID0gKHJlY29yZCwgbmFtZXMpID0+XG4gIGhhcmRlbihuYW1lcy5tYXAobmFtZSA9PiByZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzID0gQXJyYXkoMTYpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgaSkgPT4gJzAnLnJlcGVhdChpKSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB6ZXJvUGFkID0gKG4sIHNpemUpID0+IHtcbiAgY29uc3QgblN0ciA9IGAke259YDtcbiAgY29uc3QgZmlsbExlbiA9IHNpemUgLSBuU3RyLmxlbmd0aDtcbiAgaWYgKGZpbGxMZW4gPT09IDApIHJldHVybiBuU3RyO1xuICBhc3NlcnQoZmlsbExlbiA+IDAgJiYgZmlsbExlbiA8IHplcm9lcy5sZW5ndGgpO1xuICByZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xufTskaM2PX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBhc051bWJlciA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cyA9ICdmZmY4MDAwMDAwMDAwMDAwJztcblxuLypcblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0ID0gbiA9PiB7XG4gIC8vXG4gIGlmIChpcyhuLCAtMCkpIHtcbiAgICBuID0gMDtcbiAgfSBlbHNlIGlmIChpcyhuLCBOYU4pKSB7XG4gICAgcmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gIH1cbiAgYXNOdW1iZXJbMF0gPSBuO1xuICBsZXQgYml0cyA9IGFzQml0c1swXTtcbiAgaWYgKG4gPCAwKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICByZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksIDE2KX1gO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICdmJyB8fCBGYWlsYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IGJpdHMgPSBCaWdJbnQoYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpfWApO1xuICBpZiAoZW5jb2RlZC5jaGFyQXQoc2tpcCArIDEpIDwgJzgnKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICBhc0JpdHNbMF0gPSBiaXRzO1xuICBjb25zdCByZXN1bHQgPSBhc051bWJlclswXTtcbiAgIWlzKHJlc3VsdCwgLTApIHx8XG4gICAgRmFpbGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQgPSBuID0+IHtcbiAgY29uc3QgYWJzID0gbiA8IDBuID8gLW4gOiBuO1xuICBjb25zdCBuRGlnaXRzID0gYWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBjb25zdCBsRGlnaXRzID0gbkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbiAgaWYgKG4gPCAwbikge1xuICAgIHJldHVybiBgbiR7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvL1xuICAgICAgKDEwICoqIGxEaWdpdHMgLSBuRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsICcwJylcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgKyBuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsICcwJylcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHAke1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAnficucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLy9cbiAgICAgIG5EaWdpdHNcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgblxuICAgIH1gO1xuICB9XG59O1xuXG5jb25zdCByQmlnSW50UGF5bG9hZCA9IC8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qXG5cblxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQgPSBlbmNvZGVkID0+IHtcbiAgY29uc3QgdHlwZVByZWZpeCA9IGVuY29kZWQuY2hhckF0KDApOyAvL1xuICB0eXBlUHJlZml4ID09PSAncCcgfHxcbiAgICB0eXBlUHJlZml4ID09PSAnbicgfHxcbiAgICBGYWlsYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBjb25zdCB7XG4gICAgaW5kZXg6IGxEaWdpdHMsXG4gICAgMTogc25EaWdpdHMsXG4gICAgMjogdGFpbCxcbiAgICAzOiBkaWdpdHMsXG4gIH0gPSBlbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKSB8fCBGYWlsYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBzbkRpZ2l0cy5sZW5ndGggPT09IGxEaWdpdHMgfHxcbiAgICBGYWlsYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbkRpZ2l0cyA9IHBhcnNlSW50KHNuRGlnaXRzLCAxMCk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbkRpZ2l0cyA9IDEwICoqIC8qICAgICAgICAgICAgICAgICAqLyAobERpZ2l0cykgLSBuRGlnaXRzO1xuICB9XG5cbiAgdGFpbC5jaGFyQXQoMCkgPT09ICc6JyB8fCBGYWlsYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGRpZ2l0cy5sZW5ndGggPT09IG5EaWdpdHMgfHxcbiAgICBGYWlsYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuID0gQmlnSW50KGRpZ2l0cyk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbiA9IC0oMTBuICoqIEJpZ0ludChuRGlnaXRzKSAtIG4pO1xuICB9XG5cbiAgcmV0dXJuIG47XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGNwKSA9PiB7XG4gICAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICAgIHJldHVybiAnIV8nO1xuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiAnIXwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgICB9XG4gIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV0gPSAnX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV0gPSAnX18nO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gc3RyID0+XG4gIHN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywgY2ggPT4gc3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2ggPSAvKiAgICAgICAgICAgICAgICAgKi8gKHN1ZmZpeCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIChwcmVmaXggPT09ICchJyAmJiBzdWZmaXggIT09IHVuZGVmaW5lZCAmJiBjaCA+PSAnIScgJiYgY2ggPD0gJ0AnKSB8fFxuICAgICAgICAgIEZhaWxgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApIC0gMHgyMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IHN0ciA9PiBzdHI7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4gZW5jb2RlZDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydeJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGNoYXJzLnB1c2goZW5jLCAnICcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBsZXQgZGVwdGggPSAwO1xuICAvL1xuICAvL1xuICBsZXQgbmV4dEluZGV4ID0gc2tpcCArIDE7XG4gIGxldCBjdXJyZW50RWxlbWVudFN0YXJ0ID0gc2tpcCArIDE7XG4gIGZvciAoY29uc3QgeyAwOiBjaCwgaW5kZXg6IGkgfSBvZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpIHtcbiAgICBjb25zdCBpbmRleCA9IC8qICAgICAgICAgICAgICAgICAqLyAoaSk7XG4gICAgaWYgKGluZGV4IDw9IHNraXApIHtcbiAgICAgIGlmIChpbmRleCA9PT0gc2tpcCkge1xuICAgICAgICBjaCA9PT0gJ14nIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGlmIChpbmRleCA9PT0gbmV4dEluZGV4KSB7XG4gICAgICAgIC8vXG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGRlcHRoID49IDAgfHxcbiAgICAgICAgICAvL1xuICAgICAgICAgIEZhaWxgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLCBpbmRleCArIDIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICBkZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsIGluZGV4KSksXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8vXG4gICAgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICB9XG4gIGRlcHRoID09PSAwIHx8IEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBuZXh0SW5kZXggPT09IGVuY29kZWQubGVuZ3RoIHx8XG4gICAgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG4gICAgICBlbmNvZGVkLFxuICAgICAgY3VycmVudEVsZW1lbnRTdGFydCxcbiAgICApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydbJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgYyBvZiBlbmMpIHtcbiAgICAgIGlmIChjID09PSAnXFx1MDAwMCcgfHwgYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICAgIGNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiAgICAgIH1cbiAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeUFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBjb25zdCBlbGVtQ2hhcnMgPSBbXTtcbiAgLy9cbiAgLy9cbiAgbGV0IHN0aWxsVG9Ta2lwID0gc2tpcCArIDE7XG4gIGxldCBpbkVzY2FwZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGMgb2YgZW5jb2RlZCkge1xuICAgIGlmIChzdGlsbFRvU2tpcCA+IDApIHtcbiAgICAgIHN0aWxsVG9Ta2lwIC09IDE7XG4gICAgICBpZiAoc3RpbGxUb1NraXAgPT09IDApIHtcbiAgICAgICAgYyA9PT0gJ1snIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluRXNjYXBlKSB7XG4gICAgICBjID09PSAnXFx1MDAwMCcgfHxcbiAgICAgICAgYyA9PT0gJ1xcdTAwMDEnIHx8XG4gICAgICAgIEZhaWxgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb25zdCBlbmNvZGVkRWxlbWVudCA9IGVsZW1DaGFycy5qb2luKCcnKTtcbiAgICAgIGVsZW1DaGFycy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMScpIHtcbiAgICAgIGluRXNjYXBlID0gdHJ1ZTtcbiAgICAgIC8vXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGluRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgIWluRXNjYXBlIHx8IEZhaWxgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgZWxlbUNoYXJzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQgPSAocmVjb3JkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgbmFtZXMgPSByZWNvcmROYW1lcyhyZWNvcmQpO1xuICBjb25zdCB2YWx1ZXMgPSByZWNvcmRWYWx1ZXMocmVjb3JkLCBuYW1lcyk7XG4gIHJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcywgdmFsdWVzXSksIGVuY29kZVBhc3NhYmxlKX1gO1xufTtcblxuY29uc3QgZGVjb2RlUmVjb3JkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnKCcpO1xuICAvL1xuICAvL1xuICBjb25zdCB1bnppcHBlZEVudHJpZXMgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB1bnppcHBlZEVudHJpZXMubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBba2V5cywgdmFsc10gPSB1bnppcHBlZEVudHJpZXM7XG5cbiAgKHBhc3NTdHlsZU9mKGtleXMpID09PSAnY29weUFycmF5JyAmJlxuICAgIHBhc3NTdHlsZU9mKHZhbHMpID09PSAnY29weUFycmF5JyAmJlxuICAgIGtleXMubGVuZ3RoID09PSB2YWxzLmxlbmd0aCAmJlxuICAgIGtleXMuZXZlcnkoa2V5ID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSkgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgbWFwRW50cmllcyA9IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHNbaV1dKTtcbiAgY29uc3QgcmVjb3JkID0gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbiAgYXNzZXJ0UmVjb3JkKHJlY29yZCwgJ2RlY29kZWQgcmVjb3JkJyk7XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQgPSAodGFnZ2VkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+XG4gIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLCB0YWdnZWQucGF5bG9hZF0pLCBlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnOicpO1xuICAvL1xuICAvL1xuICBjb25zdCB0YWdnZWRQYXlsb2FkID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdGFnZ2VkUGF5bG9hZC5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFt0YWcsIHBheWxvYWRdID0gdGFnZ2VkUGF5bG9hZDtcbiAgcGFzc1N0eWxlT2YodGFnKSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgICBGYWlsYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1JlbW90YWJsZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVQcm9taXNlID0gKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSAocCwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVByb21pc2UocCwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJz8nKSB8fFxuICAgICAgRmFpbGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUHJvbWlzZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVByb21pc2U7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlRXJyb3IgPSAodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gKGVyciwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZUVycm9yKGVyciwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJyEnKSB8fFxuICAgICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gbWFrZUVuY29kZVJlbW90YWJsZShcbiAgICB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgdmVyaWZ5RW5jb2RpbmcsXG4gICk7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSBtYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZyk7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gbWFrZUVuY29kZUVycm9yKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZyk7XG5cbiAgY29uc3QgaW5uZXJFbmNvZGUgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOiB7XG4gICAgICAgIHJldHVybiAndic7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAneic7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHJldHVybiBgcyR7ZW5jb2RlU3RyaW5nU3VmZml4KHBhc3NhYmxlKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgcmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlbW90YWJsZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICByZXR1cm4gYHkke2VuY29kZVN0cmluZ1N1ZmZpeChuYW1lKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gIC8qICAgICAgICAgICAgICAgICAgKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBib29sZWFuOiAnYicsXG4gIG51bWJlcjogJ2YnLFxuICBiaWdpbnQ6ICducCcsXG4gIHJlbW90YWJsZTogJ3InLFxuICBzdHJpbmc6ICdzJyxcbiAgbnVsbDogJ3YnLFxuICBzeW1ib2w6ICd5JyxcbiAgLy9cbiAgLy9cbiAgLy9cbiAgdW5kZWZpbmVkOiAneicsXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IFFDTEFTUyA9ICdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLypcblxuXG4gKi9cbmNvbnN0IGhhc1FDbGFzcyA9IGVuY29kZWQgPT4gaGFzT3duUHJvcGVydHlPZihlbmNvZGVkLCBRQ0xBU1MpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzID0gKGVuY29kZWQsIHFjbGFzcykgPT5cbiAgaXNPYmplY3QoZW5jb2RlZCkgJiZcbiAgIWlzQXJyYXkoZW5jb2RlZCkgJiZcbiAgaGFzUUNsYXNzKGVuY29kZWQpICYmXG4gIGVuY29kZWRbUUNMQVNTXSA9PT0gcWNsYXNzO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IHJlbSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSBlcnIgPT4gRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9DYXBEYXRhID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICd1bmRlZmluZWQnIH07XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdJbmZpbml0eScgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICctSW5maW5pdHknIH07XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdiaWdpbnQnLFxuICAgICAgICAgIGRpZ2l0czogU3RyaW5nKHBhc3NhYmxlKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3N5bWJvbCcsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLCBRQ0xBU1MpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCB7IFtRQ0xBU1NdOiBxY2xhc3NWYWx1ZSwgLi4ucmVzdCB9ID0gcGFzc2FibGU7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ2hpbGJlcnQnLFxuICAgICAgICAgICAgb3JpZ2luYWw6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXN1bHQucmVzdCA9IGVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAndGFnZ2VkJyxcbiAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9DYXBEYXRhUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICApfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdzbG90JyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnZXJyb3InKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IHNsb3RFbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGVycm9yRW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gICAgRmFpbGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEsXG4gICAgKX0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZUZyb21DYXBEYXRhID0ganNvbkVuY29kZWQgPT4ge1xuICAgIGlmICghaXNPYmplY3QoanNvbkVuY29kZWQpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCAnb3JpZ2luYWwnKSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBbUUNMQVNTXTogZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpIH07XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsICdyZXN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTm9uRW1wdHlPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgcmVzdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgcmVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxO1xuICAgICAgICAgICAgaWYgKCFpc05vbkVtcHR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN0T2JqID0gZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAhaGFzT3duUHJvcGVydHlPZihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9hgbT0EsAABBLAAALQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgaXMsIGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEJBTkcgPSAnIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0ggPSAnLScuY2hhckNvZGVBdCgwKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbCA9IGVuY29kZWRTdHIgPT4ge1xuICBpZiAoZW5jb2RlZFN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9cbiAgY29uc3QgY29kZSA9IGVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbiAgLy9cbiAgcmV0dXJuIEJBTkcgPD0gY29kZSAmJiBjb2RlIDw9IERBU0g7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gcmVtID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBlcnIgPT5cbiAgRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yID0gZW5jb2RpbmcgPT4ge1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdvYmplY3QnICYmIGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8vXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICBjb25zdCB7ICcjdGFnJzogdGFnLCBwYXlsb2FkLCAuLi5yZXN0IH0gPSBlbmNvZGluZztcbiAgICAgICAgICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQoXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywgJyNlcnJvcicpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVzdWx0KSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW2VuY29kZWROYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBlbmNvZGVkTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgIGVuY29kZWROYW1lLFxuICAgICAgICAgICAgKX0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgZW5jb2RlZE5hbWUuY2hhckF0KDApICE9PSAnIycgfHxcbiAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xuICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbiAgICAgICAgICAgIHR5cGVvZiBlbmNvZGluZyxcbiAgICAgICAgICApfTogJHtlbmNvZGluZ31gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOaLU7BoLwAAaC8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBzdHJpbmdpZnk6IHF1b3RlIH0gPSBKU09OO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlciA9ICgpID0+IHtcbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICBsZXQgbGV2ZWwgPSAwO1xuICBsZXQgbmVlZFNwYWNlID0gZmFsc2U7XG4gIGNvbnN0IGxpbmUgPSAoKSA9PiB7XG4gICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgcmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywgJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4ge1xuICAgICAgbGV2ZWwgKz0gMTtcbiAgICAgIGlmIChuZWVkU3BhY2UpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuICAgIH0sXG4gICAgbGluZSxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAobmVlZFNwYWNlICYmIHRva2VuICE9PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmICghaXNPYmplY3QocmF3VHJlZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZih0YWcsICdzdHJpbmcnKTtcbiAgICAgICAgICBwcmVwYXJlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgICBOYXQoaW5kZXgpO1xuICAgICAgICAgIGlmIChpZmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKGlmYWNlLCAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgJ29yaWdpbmFsJyBpbiByYXdUcmVlIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbiAgICAgICAgICBwcmVwYXJlKG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyZXN0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUUNMQVNTIGluIHJlc3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIHByZXBhcmUocmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBhc3NlcnQuZmFpbChYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyYXdUcmVlKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgfVxuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlSW5kZW50ZXIgPSBzaG91bGRJbmRlbnQgPyBtYWtlWWVzSW5kZW50ZXIgOiBtYWtlTm9JbmRlbnRlcjtcbiAgbGV0IG91dCA9IG1ha2VJbmRlbnRlcigpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGUgPSByYXdUcmVlID0+IHtcbiAgICAvL1xuICAgIHJldHVybiByZWN1cihyYXdUcmVlKTtcbiAgfTtcblxuICBjb25zdCBkZWNvZGVQcm9wZXJ0eSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIG91dC5saW5lKCk7XG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgb3V0Lm5leHQoYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiAgICB9IGVsc2UgaWYgKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICBvdXQubmV4dChgJHtuYW1lfTpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lm5leHQoYCR7cXVvdGUobmFtZSl9OmApO1xuICAgIH1cbiAgICBkZWNvZGUodmFsdWUpO1xuICAgIG91dC5uZXh0KCcsJyk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgcmVjdXIgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHJhd1RyZWUpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICBhc3NlcnQudHlwZW9mKHFjbGFzcywgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoZGlnaXRzLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5uZXh0KGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBsZXQgeyBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFJlbmRlciA9IGFyZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRPdXQgPSBvdXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBvdXQgPSBtYWtlTm9JbmRlbnRlcigpO1xuICAgICAgICAgICAgICBkZWNvZGUoYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5kb25lKCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBvdXQgPSBvbGRPdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBzbG90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBuZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbiAgICAgICAgICAgIGlmIChpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9KWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkoUUNMQVNTLCBvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHJlc3QsICdvYmplY3QnKTtcbiAgICAgICAgICAgIGFzc2VydChyZXN0ICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgKX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIG5hbWUgIT09IGBBZ2dyZWdhdGVFcnJvcmAgfHxcbiAgICAgICAgICAgIEZhaWxgQWdncmVnYXRlRXJyb3Igbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgZXJyb3JzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbignWycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0LmxpbmUoKTtcbiAgICAgICAgICBkZWNvZGUocmF3VHJlZVtpXSk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyYXdUcmVlKSk7XG4gICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgne30nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJhd1RyZWVbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHByZXBhcmUoZW5jb2RpbmcpO1xuICBkZWNvZGUoZW5jb2RpbmcpO1xuICByZXR1cm4gb3V0LmRvbmUoKTtcbn07JGjNj19vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiAgICAgICAgICAgICAgICAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLy9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eU9mLHRvUGFzc2FibGVFcnJvcixYLEZhaWwscSxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixvYmplY3RNYXAsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKHRvUGFzc2FibGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaM2PX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbiA9IHggPT4geDtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuID0gKHgsIF8pID0+IHg7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXJzaGFsID0gKFxuICBjb252ZXJ0VmFsVG9TbG90ID0gZGVmYXVsdFZhbFRvU2xvdEZuLFxuICBjb252ZXJ0U2xvdFRvVmFsID0gZGVmYXVsdFNsb3RUb1ZhbEZuLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nID0gJ29uJyxcbiAgICBtYXJzaGFsTmFtZSA9ICdhbm9uLW1hcnNoYWwnLFxuICAgIC8vXG4gICAgLy9cbiAgICBlcnJvcklkTnVtID0gMTAwMDAsXG4gICAgLy9cbiAgICAvL1xuICAgIG1hcnNoYWxTYXZlRXJyb3IgPSBlcnIgPT5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgICAvL1xuICAgIC8vXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdjYXBkYXRhJyxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsICdzdHJpbmcnKTtcbiAgZXJyb3JUYWdnaW5nID09PSAnb24nIHx8XG4gICAgZXJyb3JUYWdnaW5nID09PSAnb2ZmJyB8fFxuICAgIEZhaWxgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbiAgY29uc3QgbmV4dEVycm9ySWQgPSAoKSA9PiB7XG4gICAgZXJyb3JJZE51bSArPSAxO1xuICAgIHJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gIH07XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gcm9vdCA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBlbmNvZGVTbG90Q29tbW9uID0gcGFzc2FibGUgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gc2xvdE1hcC5nZXQocGFzc2FibGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBzbG90cy5sZW5ndGg7XG4gICAgICBjb25zdCBzbG90ID0gY29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG4gICAgICBzbG90cy5wdXNoKHNsb3QpO1xuICAgICAgc2xvdE1hcC5zZXQocGFzc2FibGUsIGluZGV4KTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgLypcblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZW5jb2RlRXJyb3JDb21tb24gPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVuY29kZVJlY3VyKGAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBuYW1lID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm5hbWV9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChlcnJvclRhZ2dpbmcgPT09ICdvbicpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXJyb3JJZCA9IGVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKGVycm9ySWQsICdzdHJpbmcnKTtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnIsIFhgU2VudCBhcyAke2Vycm9ySWR9YCk7XG4gICAgICAgIG1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGVycm9ySWQsIG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdjYXBkYXRhJykge1xuICAgICAgLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YSA9IChwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGlmYWNlLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSAodmFsLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEodmFsLCBnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnZXJyb3InLCAuLi5lcnJEYXRhIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gbWFrZUVuY29kZVRvQ2FwRGF0YSh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvQ2FwRGF0YShyb290KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBib2R5LFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ3NtYWxsY2FwcycpIHtcbiAgICAgIC8qXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzID0gKHByZWZpeCwgcGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IChyZW1vdGFibGUsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJywgcmVtb3RhYmxlLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJywgcHJvbWlzZSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ucmVzdCB9ID0gZXJyRGF0YTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0IH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBtYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VGdWxsUmV2aXZlID0gc2xvdHMgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgdmFsTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlU2xvdENvbW1vbiA9IHNsb3REYXRhID0+IHtcbiAgICAgIGNvbnN0IHsgaWZhY2UgPSB1bmRlZmluZWQsIGluZGV4LCAuLi5yZXN0IH0gPSBzbG90RGF0YTtcbiAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgIGNvbnN0IGV4dGFudCA9IHZhbE1hcC5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGV4dGFudCkge1xuICAgICAgICByZXR1cm4gZXh0YW50O1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnZlcnRTbG90VG9WYWwoc2xvdCwgaWZhY2UpO1xuICAgICAgdmFsTWFwLnNldChpbmRleCwgdmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlRXJyb3JDb21tb24gPSAoZXJyRGF0YSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3JJZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfSA9IGVyckRhdGE7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZE5hbWUgPSBkZWNvZGVSZWN1cihuYW1lKTtcbiAgICAgIGNvbnN0IGRNZXNzYWdlID0gZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4gICAgICAvL1xuICAgICAgY29uc3QgZEVycm9ySWQgPSAvKiAgICAgICAgICAgICAgICAgKi8gKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICBkRXJyb3JJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICA6IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgIHNhbml0aXplOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoY2F1c2UpIHtcbiAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGRlY29kZVJlY3VyKGNhdXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvcnMgPSBkZWNvZGVSZWN1cihlcnJvcnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3RXJyb3IgPSBtYWtlRXJyb3IoZE1lc3NhZ2UsIGVyckNvbnN0cnVjdG9yLCBvcHRpb25zKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBkZXNjcyA9IG9iamVjdE1hcChyZXN0LCBkYXRhID0+ICh7XG4gICAgICAgIHZhbHVlOiBkZWNvZGVSZWN1cihkYXRhKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsIGRlc2NzKTtcbiAgICAgIGhhcmRlbihyYXdFcnJvcik7XG4gICAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKHJhd0Vycm9yKTtcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gKHJhd1RyZWUsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uc2xvdERhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLmVyckRhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tQ2FwRGF0YSA9IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcyA9IHByZWZpeCA9PiB7XG4gICAgICAvKlxuXG5cblxuICAgICAgICovXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgaSA9IHN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSwgaSA8IDAgPyB1bmRlZmluZWQgOiBpKSk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGlmYWNlID0gaSA8IDAgPyB1bmRlZmluZWQgOiBzdHJpbmdFbmNvZGluZy5zbGljZShpICsgMSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHsgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbiAgICBjb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSA9IGVuY29kaW5nO1xuICAgICAgIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8vXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLy9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqw1V3rLgAA6y4AACUAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLEZhaWwscSxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIixbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMsIHNldFByb3RvdHlwZU9mLCBpcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvID0gKHgsIHkpID0+IHggPT09IHkgfHwgaXMoeCwgeSk7XG5cbiAgICAgICBjb25zdCB0cml2aWFsQ29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT5cbiAgLy9cbiAgbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID09PSByaWdodCA/IDAgOiAxO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UudHJpdmlhbENvbXBhcmF0b3IodHJpdmlhbENvbXBhcmF0b3IpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgZnJvbUVudHJpZXMoXG4gICAgZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbiAgICAgIC8vXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcmVmaXhlcyA9PT0gWy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJykgfHxcbiAgICAgICAgICBGYWlsYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gW1xuICAgICAgICAgIHByZWZpeGVzLmNoYXJBdCgwKSxcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoIC0gMSkgKyAxKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFtwYXNzU3R5bGUsIHsgaW5kZXgsIGNvdmVyIH1dO1xuICAgICAgfSksXG4gIClcbik7XG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0UGFzc1N0eWxlQ292ZXIgPSBwYXNzU3R5bGUgPT4gcGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaM2PX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLypcblxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyYXRvcktpdCA9IChjb21wYXJlUmVtb3RhYmxlcyA9IChfeCwgX3kpID0+IE5hTikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgaWYgKHNhbWVWYWx1ZVplcm8obGVmdCwgcmlnaHQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gICAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLypcblxuICAgICAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxlZnQgPCByaWdodCkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQobGVmdCA+IHJpZ2h0KTtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSkge1xuICAgICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBpZiAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydChsZWZ0ID4gcmlnaHQpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGFiZWxDb21wID0gY29tcGFyYXRvcihnZXRUYWcobGVmdCksIGdldFRhZyhyaWdodCkpO1xuICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ29tcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8qICAgICAgICAgICAgICAgKi9cbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBvdXRlckNvbXBhcmF0b3IgPSAoeCwgeSkgPT5cbiAgICAvL1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoY29tcGFyYXRvcih4LCB5KSB8fCAwKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhbnRpQ29tcGFyYXRvciA9ICh4LCB5KSA9PiBvdXRlckNvbXBhcmF0b3IoeSwgeCk7XG5cbiAgbWVtb09mU29ydGVkLnNldChvdXRlckNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBtZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQob3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvcik7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLCBvdXRlckNvbXBhcmF0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBjb21wYXJhdG9yOiBvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yIH0pO1xufTtcbi8qXG5cblxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbiAgICAgICBjb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSBjb21wYXJhdG9yID0+XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuICAgICAgIGNvbnN0IGlzUmFua1NvcnRlZCA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpID09PSAnY29weUFycmF5Jyk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFzc2FibGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGNvbXBhcmUocGFzc2FibGVzW2kgLSAxXSwgcGFzc2FibGVzW2ldKSA+PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJhbmtTb3J0ZWQgPSAoc29ydGVkLCBjb21wYXJlKSA9PlxuICBpc1JhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKSB8fFxuICAvL1xuICAvL1xuICBGYWlsYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLCBjb21wYXJlKX1gOyRozY9fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzb3J0QnlSYW5rID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKSB7XG4gICAgaGFyZGVuKHBhc3NhYmxlcyk7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsIGNvbXBhcmUpKSB7XG4gICAgICByZXR1cm4gcGFzc2FibGVzO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bnNvcnRlZCA9IFsuLi5wYXNzYWJsZXNdO1xuICB1bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyogICAgICAgICAgICAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAEBlbmRvL25hdC12NS4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAL0dmpNCgAATQoAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3N0cmluZy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3N0cmluZy5qcyI6W1siaXNXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRQYXNzYWJsZVN0cmluZyJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbInRvVGhyb3dhYmxlIiwidG9UaHJvd2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw+/2RbwGAAC8BgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5LCBwcm90b3R5cGU6IGFycmF5UHJvdG90eXBlIH0gPSBBcnJheTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBDb3B5QXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5QXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gYXJyYXlQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBsZW4gPSAvKiAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAnbGVuZ3RoJywgZmFsc2UsIGFzc2VydENoZWNrZXIpLnZhbHVlXG4gICAgKTtcbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCBpLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gbGVuICsgMSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEIFEwPYIAAD2CAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxnZXRPd25EYXRhRGVzY3JpcHRvcixDWDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQgPSAoY2FuZGlkYXRlLCBrZXksIHZhbHVlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoIWNhbkJlTWV0aG9kKHZhbHVlKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgLy9cbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgQ29weVJlY29yZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlSZWNvcmQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSwgY2hlY2spICYmXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeShrZXkgPT5cbiAgICAgICAgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLCBrZXksIGNhbmRpZGF0ZVtrZXldLCBjaGVjayksXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBnZXRPd25EYXRhRGVzY3JpcHRvcihcbiAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cnVlLFxuICAgICAgICBhc3NlcnRDaGVja2VyLFxuICAgICAgKTtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpO1xuICAgIH1cbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkID0gYXN5bmMgdmFsID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cblxuICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHZhbCkpIHtcbiAgICByZXR1cm4gRS53aGVuKHZhbCwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIGNvbnN0IHJlYyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICBjb25zdCBuYW1lcyA9IC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJlYykpO1xuICAgICAgY29uc3QgdmFsUHMgPSBuYW1lcy5tYXAobmFtZSA9PiBkZWVwbHlGdWxmaWxsZWQocmVjW25hbWVdKSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT5cbiAgICAgICAgaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLCBpKSA9PiBbbmFtZXNbaV0sIGNdKSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgY29uc3QgYXJyID0gLyogICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdmFsUHMgPSBhcnIubWFwKHAgPT4gZGVlcGx5RnVsZmlsbGVkKHApKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PiBoYXJkZW4odmFscykpO1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyogICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vL1xuLy9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06KQfKQGAACkBgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyogICAgICAgICAgICAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLy9cbiAgLy9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8vXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8vXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLy9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8vXG4gIC8vXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLy9cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiAgICAgICAgICAgICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8vXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABwRFyEohcAAKIXAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0T3duRGF0YURlc2NyaXB0b3IiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldFByb3RvdHlwZU9mLFxuICBoYXNPd25Qcm9wZXJ0eTogb2JqZWN0SGFzT3duUHJvcGVydHksXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sLFxuKTtcbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPT09ICdmdW5jdGlvbicpO1xuXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IChvYmosIHByb3ApID0+XG4gIGFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LCBvYmosIFtwcm9wXSk7JGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbi8vXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gT2JqZWN0KHZhbCkgPT09IHZhbDskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzVHlwZWRBcnJheSA9IG9iamVjdCA9PiB7XG4gIC8vXG4gIGNvbnN0IHRhZyA9IGFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZywgb2JqZWN0LCBbXSk7XG4gIHJldHVybiB0YWcgIT09IHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbiAgICAgICBjb25zdCBQQVNTX1NUWUxFID0gU3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG4gICAgICAgY29uc3QgY2FuQmVNZXRob2QgPSBmdW5jID0+XG4gIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmICEoUEFTU19TVFlMRSBpbiBmdW5jKTskaM2PX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093blByb3BlcnR5T2YoZGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoc2hvdWxkQmVFbnVtZXJhYmxlXG4gICAgICA/IGRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApXG4gICAgICA6ICFkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpXG4gICAgPyBkZXNjXG4gICAgOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKC8qICAgICAgICAgICAgICAgICAgKi8gKHVuZGVmaW5lZCkpO1xufTskaM2PX29uY2UuZ2V0T3duRGF0YURlc2NyaXB0b3IoZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuaGFyZGVuKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldFRhZyA9IHRhZ1JlY29yZCA9PiB0YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaM2PX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuICAgICAgIGNvbnN0IGNoZWNrUGFzc1N0eWxlID0gKG9iaiwgcGFzc1N0eWxlLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICBwYXNzU3R5bGUgPT09IGV4cGVjdGVkUGFzc1N0eWxlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZCA9IGNoZWNrUHJvdG8gPT4ge1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1RhZ1JlY29yZCA9ICh0YWdSZWNvcmQsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAoaXNPYmplY3QodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAydba3TKwAA0ysAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxhc3NlcnRDaGVja2VyLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsWyRozY9fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIixbJGjNj19hID0+IChFcnJvckhlbHBlciA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLFskaM2PX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgY29weUFycmF5OiB1bmRlZmluZWQsXG4gICAgY29weVJlY29yZDogdW5kZWZpbmVkLFxuICAgIHRhZ2dlZDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgcmVtb3RhYmxlOiB1bmRlZmluZWQsXG4gIH07XG4gIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICBjb25zdCB7IHN0eWxlTmFtZSB9ID0gaGVscGVyO1xuICAgIHN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZSB8fCBGYWlsYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9IGhlbHBlcjtcbiAgfVxuICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSkge1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFZhbGlkID0gKGhlbHBlciwgY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gIGhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG4gIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2YgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSBtYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG4gIGNvbnN0IHJlbW90YWJsZUhlbHBlciA9IEhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBhc3NTdHlsZU1lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qXG5cbiAgICovXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZU9mID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGluUHJvZ3Jlc3MgPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZlJlY3VyID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgaW5uZXJJc09iamVjdCA9IGlzT2JqZWN0KGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIENvcHlSZWNvcmRIZWxwZXIsXG4gICAgVGFnZ2VkSGVscGVyLFxuICAgIEVycm9ySGVscGVyLFxuICAgIFJlbW90YWJsZUhlbHBlcixcbiAgXSk7JGjNj19vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlID0gdmFsID0+IHtcbiAgcGFzc1N0eWxlT2YodmFsKTsgLy9cbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgdHJ5IHtcbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSwgZGVzYywgcGFzc1N0eWxlT2YpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRvUGFzc2FibGVFcnJvciA9IGVyciA9PiB7XG4gIGhhcmRlbihlcnIpO1xuICBpZiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZikpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyO1xuICBjb25zdCB7IGNhdXNlOiBjYXVzZURlc2MsIGVycm9yczogZXJyb3JzRGVzYyB9ID1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvL1xuICAgIGNhdXNlLFxuICAgIGVycm9ycyxcbiAgfSk7XG4gIC8vXG4gIGhhcmRlbihuZXdFcnJvcik7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGFubm90YXRlRXJyb3IobmV3RXJyb3IsIFhgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG4gIHBhc3NTdHlsZU9mKG5ld0Vycm9yKSA9PT0gJ2Vycm9yJyB8fFxuICAgIEZhaWxgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG4gIHJldHVybiBuZXdFcnJvcjtcbn07JGjNj19vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b1Rocm93YWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgaGFyZGVuKHNwZWNpbWVuKTtcbiAgaWYgKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IoLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKSk7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICBpZiAoaXNPYmplY3Qoc3BlY2ltZW4pKSB7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudCA9PT0gdG9UaHJvd2FibGUoZWxlbWVudCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgY29uc3QgcmVjID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMocmVjKSkge1xuICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGcgPSAvKiAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGc7XG4gICAgICAgIHBheWxvYWQgPT09IHRvVGhyb3dhYmxlKHBheWxvYWQpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtwYXlsb2FkfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVyID0gLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZXIgPT09IHRvVGhyb3dhYmxlKGVyKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZXJ9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG59OyRozY9fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWcsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLy9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICBpc09iamVjdChvcmlnaW5hbCkgfHxcbiAgICBGYWlsYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuICBpZiAoXG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgIHByb3RvID09PSBudWxsIHx8XG4gICAgcHJvdG8gPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKFBBU1NfU1RZTEUpO1xuICBjb25zdCB0YWdLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBbLyogICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgLi4ucmVzdERlc2NzXG4gIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxuICByZXR1cm4gKFxuICAgIChvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSAmJlxuICAgIGNoZWNrSWZhY2UoaWZhY2UsIGNoZWNrKVxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzID0gbmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGUgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghaXNGcm96ZW4odmFsKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWBcbiAgICApO1xuICB9XG4gIC8vXG4gIGlmICghUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlT2YgPSB2YWwgPT4ge1xuICBpZiAoXG4gICAgIWlzT2JqZWN0KHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoaXNPYmplY3QoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICghaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KGtleSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLy9cbiAgICAgICAgICAoaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2YsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGlzRnJvemVuLCBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLCBrZXkpLFxuICApO1xuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YDtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNoZWNrU2FmZU93bktleSA9IGtleSA9PiB7XG4gICAgaWYgKGtleSA9PT0gdG9TdHJpbmdUYWcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgdGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihwciwgdG9TdHJpbmdUYWcpO1xuICAgICAgYXNzZXJ0KHRhZ0Rlc2MgIT09IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoaGFzT3duUHJvcGVydHlPZih0YWdEZXNjLCAndmFsdWUnKSB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EodGFnRGVzYyl9YCkgJiZcbiAgICAgICAgKHR5cGVvZiB0YWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkgJiZcbiAgICAgICAgKCF0YWdEZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgICBDWChjaGVjaylgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBwcltrZXldO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWwgIT09IG51bGwgJiZcbiAgICAgIGlzRnJvemVuKHZhbCkgJiZcbiAgICAgIGdldFByb3RvdHlwZU9mKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1YktleXMgPSBvd25LZXlzKHZhbCk7XG4gICAgICBpZiAoc3ViS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3ViS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgc3ViS2V5c1swXSA9PT0gJ2Rlc3Ryb3llZCcgJiZcbiAgICAgICAgdmFsLmRlc3Ryb3llZCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcbiAgICAgIFN0cmluZyhrZXkpLFxuICAgICl9IGlzICR7dmFsfWA7XG4gIH07XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlT3duS2V5KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlID0gKHByLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIChpc0Zyb3plbihwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSAmJlxuICAgIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgICAoZ2V0UHJvdG90eXBlT2YocHIpID09PSBQcm9taXNlLnByb3RvdHlwZSB8fFxuICAgICAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YocHIpLFxuICAgICAgKX1gKSAmJlxuICAgIGNoZWNrUHJvbWlzZU93bktleXMoLyogICAgICAgICAgICAgICAgICAqLyAocHIpLCBjaGVjaylcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzU2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCB4ID0+IHgpOyRozY9fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0U2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLy9cbmNvbnN0IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2QgPSAhIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzV2VsbEZvcm1lZFN0cmluZyA9IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2RcbiAgPyBzdHIgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmlzV2VsbEZvcm1lZCgpXG4gIDogc3RyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoIG9mIHN0cikge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBjcCA9IC8qICAgICAgICAgICAgICAgICAqLyAoY2guY29kZVBvaW50QXQoMCkpO1xuICAgICAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTskaM2PX29uY2UuaXNXZWxsRm9ybWVkU3RyaW5nKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oaXNXZWxsRm9ybWVkU3RyaW5nKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gc3RyID0+IHtcbiAgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cikgfHwgRmFpbGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbn07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4gICAgJ2VuYWJsZWQnLFxuICBdKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSBzdHIgPT4ge1xuICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBGYWlsYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuICAhT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFIHx8IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdG1R25QoAAOUKAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLy9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgaWYgKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW0gPSBTeW1ib2xbc3VmZml4XTtcbiAgICAgIGlmICh0eXBlb2Ygc3ltID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gc3ltO1xuICAgICAgfVxuICAgICAgRmFpbGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG59OyRozY9fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsZ2V0T3duRGF0YURlc2NyaXB0b3IsY2hlY2tQYXNzU3R5bGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsWyRozY9fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgVGFnZ2VkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAndGFnZ2VkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBjaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsIGNhbmRpZGF0ZVtQQVNTX1NUWUxFXSwgJ3RhZ2dlZCcsIGNoZWNrKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBjaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsICd0YWdnZWQnLCBhc3NlcnRDaGVja2VyKTtcblxuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoUEFTU19TVFlMRSk7XG4gICAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgICBjb25zdCB7XG4gICAgICAvL1xuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IF9sYWJlbERlc2MsXG4gICAgICBwYXlsb2FkOiBfcGF5bG9hZERlc2MsIC8vXG4gICAgICAuLi5yZXN0RGVzY3NcbiAgICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuICAgIC8vXG4gICAgLy9cbiAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAncGF5bG9hZCcsIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLHBhc3NTdHlsZU9mOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpc0NvcHlBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnY29weUFycmF5JzskaM2PX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUmVjb3JkID0gcmVjb3JkID0+IHBhc3NTdHlsZU9mKHJlY29yZCkgPT09ICdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBhcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnY29weUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG4gIHJlbW90YWJsZSxcbiAgb3B0TmFtZU9mUmVtb3RhYmxlID0gJ0FsbGVnZWQgcmVtb3RhYmxlJyxcbikgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP0XT32IGAABiBgAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVByb21pc2VLaXQoKSB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9ID0gbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xufVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gcmFjZVByb21pc2VzKHZhbHVlcykge1xuICByZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSwgdmFsdWVzKSk7XG59XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdYhBfmQCAABkAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKlxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKSA9PT0gbWF5YmVQcm9taXNlO1xufVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADnhrPBZCQAAWQkAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qL1xuXG5jb25zdCBpc09iamVjdCA9IHZhbHVlID0+IE9iamVjdCh2YWx1ZSkgPT09IHZhbHVlO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qga25vd25Qcm9taXNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IHJlY29yZCA9PiB7XG4gIGlmICghcmVjb3JkIHx8IHJlY29yZC5zZXR0bGVkKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSByZWNvcmQ7XG4gIE9iamVjdC5hc3NpZ24ocmVjb3JkLCB7XG4gICAgZGVmZXJyZWRzOiB1bmRlZmluZWQsXG4gICAgc2V0dGxlZDogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5mcmVlemUocmVjb3JkKTtcbiAgcmV0dXJuIGRlZmVycmVkcztcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQgPSB2YWx1ZSA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90cmFtcG9saW5lLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHJhbXBvbGluZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90cmFtcG9saW5lLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM14fpGzBwAAswcAACkAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9zcmMvdHJhbXBvbGluZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNUcmFtcG9saW5lIiwiZ2VuZXJhdG9yUHJvdG90eXBlIiwic3luY1RyYW1wb2xpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJzeW5jVHJhbXBvbGluZVwifSk7JGjNj19vbmNlLnN5bmNUcmFtcG9saW5lKHN5bmNUcmFtcG9saW5lKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJhc3luY1RyYW1wb2xpbmVcIn0pOyRozY9fb25jZS5hc3luY1RyYW1wb2xpbmUoYXN5bmNUcmFtcG9saW5lKTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG4gKi9cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgYmluZCB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuY29uc3QgdW5jdXJyeVRoaXMgPSBiaW5kLmJpbmQoYmluZC5jYWxsKTsgLy9cbiAgICAgICBjb25zdCB7IHByb3RvdHlwZTogZ2VuZXJhdG9yUHJvdG90eXBlIH0gPSBnZXRQcm90b3R5cGVPZihcbiAgLy9cbiAgZnVuY3Rpb24qICgpIHt9LFxuKTskaM2PX29uY2UuZ2VuZXJhdG9yUHJvdG90eXBlKGdlbmVyYXRvclByb3RvdHlwZSk7XG5jb25zdCBnZW5lcmF0b3JOZXh0ID0gdW5jdXJyeVRoaXMoZ2VuZXJhdG9yUHJvdG90eXBlLm5leHQpO1xuY29uc3QgZ2VuZXJhdG9yVGhyb3cgPSB1bmN1cnJ5VGhpcyhnZW5lcmF0b3JQcm90b3R5cGUudGhyb3cpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBzeW5jVHJhbXBvbGluZShnZW5lcmF0b3JGbiwgLi4uYXJncykge1xuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvckZuKC4uLmFyZ3MpO1xuICBsZXQgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvcik7XG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvciwgcmVzdWx0LnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclRocm93KGl0ZXJhdG9yLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY1RyYW1wb2xpbmUoZ2VuZXJhdG9yRm4sIC4uLmFyZ3MpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3JGbiguLi5hcmdzKTtcbiAgbGV0IHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IpO1xuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWwgPSBhd2FpdCByZXN1bHQudmFsdWU7XG4gICAgICByZXN1bHQgPSBnZW5lcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yVGhyb3coaXRlcmF0b3IsIGVycik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0b3JQcm90b3R5cGUiOlsiZ2VuZXJhdG9yUHJvdG90eXBlIl0sInN5bmNUcmFtcG9saW5lIjpbInN5bmNUcmFtcG9saW5lIl0sImFzeW5jVHJhbXBvbGluZSI6WyJhc3luY1RyYW1wb2xpbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvP8BQ5oCAACaAgAAGQAAAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9yZWFkZXIuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9yZWFkZXIuanNcIiwgW11dLFtcIi4vc3JjL3dyaXRlci5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL3JlYWRlci5qcyI6W1siWmlwUmVhZGVyIiwiWmlwUmVhZGVyIl0sWyJyZWFkWmlwIiwicmVhZFppcCJdXSwiLi9zcmMvd3JpdGVyLmpzIjpbWyJaaXBXcml0ZXIiLCJaaXBXcml0ZXIiXSxbIndyaXRlWmlwIiwid3JpdGVaaXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVWounBFAAAwRQAACUAAABAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItcmVhZGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJSZWFkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwcml2YXRlRmllbGRzID0gbmV3IFdlYWtNYXAoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkc0dldCA9IHByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbiAgICAgICBjbGFzcyBCdWZmZXJSZWFkZXIge1xuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGxlbmd0aDogYnl0ZXMubGVuZ3RoLFxuICAgICAgaW5kZXg6IDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzZXQgb2Zmc2V0KG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKG9mZnNldCA+IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGgpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBzZXQgbmVnYXRpdmUgb2Zmc2V0Jyk7XG4gICAgfVxuICAgIGZpZWxkcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgZmllbGRzLmxlbmd0aCA9IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGggLSBmaWVsZHMub2Zmc2V0O1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNhblNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGZpZWxkcy5vZmZzZXQgKyBpbmRleCA8PSBmaWVsZHMubGVuZ3RoO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBhc3NlcnRDYW5TZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoIXRoaXMuY2FuU2VlayhpbmRleCkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc2VlayhpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgY29uc3QgcmVzdG9yZSA9IGZpZWxkcy5pbmRleDtcbiAgICB0aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuICAgIGZpZWxkcy5pbmRleCA9IGluZGV4O1xuICAgIHJldHVybiByZXN0b3JlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBwZWVrKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIC8vXG4gICAgc2l6ZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGZpZWxkcy5sZW5ndGggLSBmaWVsZHMuaW5kZXgsIHNpemUpKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuICAgICAgZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleCxcbiAgICAgIGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXggKyBzaXplLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGNhblJlYWQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBhc3NlcnRDYW5SZWFkKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICByZWFkKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlZWsoc2l6ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHJlYWRVaW50OCgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXg7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkVWludDE2KGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleDtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkcy5kYXRhLmdldFVpbnQxNihpbmRleCwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoNCk7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4O1xuICAgIGNvbnN0IHZhbHVlID0gZmllbGRzLmRhdGEuZ2V0VWludDMyKGluZGV4LCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgYnl0ZUF0KGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQgKyBpbmRleF07XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBza2lwKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5zZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGV4cGVjdChleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LCBleHBlY3RlZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmllbGRzLmluZGV4ICs9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBtYXRjaEF0KGluZGV4LCBleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKGluZGV4ICsgZXhwZWN0ZWQubGVuZ3RoID4gZmllbGRzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKGV4cGVjdGVkW2ldICE9PSB0aGlzLmJ5dGVBdChpbmRleCArIGkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBhc3NlcnQoZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmICghdGhpcy5leHBlY3QoZXhwZWN0ZWQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkICR7cShleHBlY3RlZCl9IGF0ICR7ZmllbGRzLmluZGV4fSwgZ290ICR7dGhpcy5wZWVrKFxuICAgICAgICAgIGV4cGVjdGVkLmxlbmd0aCxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGZpbmRMYXN0KGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBsZXQgaW5kZXggPSBmaWVsZHMubGVuZ3RoIC0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIHdoaWxlIChpbmRleCA+PSAwICYmICF0aGlzLm1hdGNoQXQoaW5kZXgsIGV4cGVjdGVkKSkge1xuICAgICAgaW5kZXggLT0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59JGjNj19vbmNlLiAgIEJ1ZmZlclJlYWRlcihCdWZmZXJSZWFkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHMgPSBzZWxmID0+IHtcbiAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXIgPSBuID0+IHtcbiAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pICYmIC8qICAgICAgICAgICAgICAgICAqLyAobikgPj0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBUeXBlRXJyb3IoYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbn07XG5cbiAgICAgICBjbGFzcyBCdWZmZXJXcml0ZXIge1xuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDE2KSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgY2FwYWNpdHksXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIGxldCBjYXBhY2l0eSA9IGZpZWxkcy5jYXBhY2l0eTtcbiAgICB3aGlsZSAoY2FwYWNpdHkgPCByZXF1aXJlZCkge1xuICAgICAgY2FwYWNpdHkgKj0gMjtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIGJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkpO1xuICAgIGZpZWxkcy5ieXRlcyA9IGJ5dGVzO1xuICAgIGZpZWxkcy5kYXRhID0gZGF0YTtcbiAgICBmaWVsZHMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5Xcml0ZShzaXplKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCArIHNpemUpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgd3JpdGUoYnl0ZXMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gICAgZmllbGRzLmJ5dGVzLnNldChieXRlcywgZmllbGRzLmluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVDb3B5KHN0YXJ0LCBlbmQpIHtcbiAgICBhc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuICAgIGFzc2VydE5hdE51bWJlcihlbmQpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgY29uc3Qgc2l6ZSA9IGVuZCAtIHN0YXJ0O1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG4gICAgZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LCBzdGFydCwgZW5kKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHdyaXRlVWludDgodmFsdWUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LCB2YWx1ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlVWludDE2KHZhbHVlLCBsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMuaW5kZXg7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LCB2YWx1ZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVVaW50MzIodmFsdWUsIGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5pbmRleDtcbiAgICBmaWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsIHZhbHVlLCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLCBlbmQpLnNsaWNlKCk7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAABAZW5kby96aXAtdjEuMC45L3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLy9cbiAgICAgICBjb25zdCBTVE9SRSA9IDA7JGjNj19vbmNlLlNUT1JFKFNUT1JFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy9jcmMzMi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY3JjMzIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCduYW1lJyx7dmFsdWU6XCJjcmMzMlwifSk7JGjNj19vbmNlLmNyYzMyKGNyYzMyKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIGxldCBjO1xuICBjb25zdCB0YWJsZSA9IFtdO1xuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgMjU2OyBuICs9IDEpIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IDg7IGsgKz0gMSkge1xuICAgICAgYyA9IGMgJiAxID8gMHhlZGI4ODMyMCBeIChjID4+PiAxKSA6IGMgPj4+IDE7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy9cbmNvbnN0IHRhYmxlID0gbWFrZVRhYmxlKCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGNyYzMyKGJ5dGVzLCBsZW5ndGggPSBieXRlcy5sZW5ndGgsIGluZGV4ID0gMCwgY3JjID0gMCkge1xuICBjb25zdCBlbmQgPSBpbmRleCArIGxlbmd0aDtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgZW5kOyBpICs9IDEpIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiBieXRlc1tpXSkgJiAweGZmXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gLTEpID4+PiAwO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmapkq54qAACeKgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwnbmFtZScse3ZhbHVlOlwicmVhZFppcFwifSk7JGjNj19vbmNlLnJlYWRaaXAocmVhZFppcCk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZykge1xuICByZXR1cm4gKGJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcikge1xuICBjb25zdCBkb3NUaW1lID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIHJldHVybiBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgICgoZG9zVGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vXG4gICAgICAoKGRvc1RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvL1xuICAgICAgKGRvc1RpbWUgPj4gMTYpICYgMHgxZiwgLy9cbiAgICAgIChkb3NUaW1lID4+IDExKSAmIDB4MWYsIC8vXG4gICAgICAoZG9zVGltZSA+PiA1KSAmIDB4M2YsIC8vXG4gICAgICAoZG9zVGltZSAmIDB4MWYpIDw8IDEgIC8vXG4gICAgKSxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcikge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb25OZWVkZWQ6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGJpdEZsYWc6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBkYXRlOiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbiAgICBjcmMzMjogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgY29tcHJlc3NlZExlbmd0aDogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiByZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVWludDgoKTtcbiAgY29uc3QgbWFkZUJ5ID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbiAgY29uc3QgZmlsZVN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbiAgY29uc3QgbmFtZSA9IHJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuICAvL1xuICByZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgaWYgKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cbiAgaWYgKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG4gIGlmIChmaWxlU3RhcnQgPT09IE1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuICBpZiAoZGlza051bWJlclN0YXJ0ID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cblxuICBjb25zdCBjb21tZW50ID0gcmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgbWFkZUJ5LFxuICAgIC4uLmhlYWRlcnMsXG4gICAgZGlza051bWJlclN0YXJ0LFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbiAgICBmaWxlU3RhcnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKSB7XG4gIGNvbnN0IHsgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgY2VudHJhbERpcmVjdG9yeVJlY29yZHMgfSA9IGxvY2F0b3I7XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgd2hpbGUgKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgY29uc3QgZW50cnkgPSByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgIC8vXG4gICAgLy9cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgJHtjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc30gcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICR7ZW50cmllcy5sZW5ndGh9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkRmlsZShyZWFkZXIpIHtcbiAgcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4gIHJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcbiAgY29uc3QgY29udGVudCA9IHJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG4gIHJldHVybiB7IG5hbWUsIC4uLmhlYWRlcnMsIGNvbnRlbnQgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZExvY2FsRmlsZXMocmVhZGVyLCByZWNvcmRzKSB7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICByZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbiAgICBjb25zdCBmaWxlID0gcmVhZEZpbGUocmVhZGVyKTtcbiAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICB9XG4gIHJldHVybiBmaWxlcztcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpIHtcbiAgaWYgKCFyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycsXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaXNrTnVtYmVyID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZSA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIGNvbnN0IGNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG4gIHJldHVybiB7XG4gICAgZGlza051bWJlcixcbiAgICBkaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG4gICAgY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemUsXG4gICAgY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZCA9IHJlYWRlci5sZW5ndGggLSAyMjtcbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlFbmQgPCAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuICB9XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuICBjb25zdCBsb2NhdG9yID0gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgemlwNjQgPVxuICAgIGxvY2F0b3IuZGlza051bWJlciA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHMgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplID09PSBNQVhfVkFMVUVfMzJCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID09PSBNQVhfVkFMVUVfMzJCSVRTO1xuXG4gIGlmICh6aXA2NCkge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemVcbiAgICAvL1xuICB9ID0gbG9jYXRvcjtcblxuICBjb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQgPVxuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgKyBjZW50cmFsRGlyZWN0b3J5U2l6ZTtcbiAgY29uc3QgZXh0cmFCeXRlcyA9IGNlbnRyYWxEaXJlY3RvcnlFbmQgLSBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ7XG5cbiAgcmVhZGVyLm9mZnNldCA9IGV4dHJhQnl0ZXM7XG5cbiAgcmV0dXJuIGxvY2F0b3I7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCwgYXJjaGl2ZU5hbWUpIHtcbiAgY29uc3QgY2VudHJhbE5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbiAgY29uc3QgbG9jYWxOYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykgIT09IGxvY2FsTmFtZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG4gICAgICAgIGNlbnRyYWxOYW1lLFxuICAgICAgKX0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICBhcmNoaXZlTmFtZSxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBmdW5jdGlvbiBjaGVjayh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG4gICAgICAgICAgbG9jYWxOYW1lLFxuICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5iaXRGbGFnID09PSBsb2NhbFJlY29yZC5iaXRGbGFnLFxuICAgIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbiAgICAgIDE2LFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCA9PT0gbG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCxcbiAgKTtcbiAgLy9cbiAgLy9cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jcmMzMiA9PT0gbG9jYWxSZWNvcmQuY3JjMzIsXG4gICAgYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gLFxuICApO1xuICBjaGVjayhcbiAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiAgICBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gLFxuICApO1xuXG4gIGNvbnN0IGNoZWNrc3VtID0gY3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG4gIGNoZWNrKFxuICAgIGNoZWNrc3VtID09PSBsb2NhbFJlY29yZC5jcmMzMixcbiAgICBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCxcbiAgKTtcbn1cblxuLypcblxuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIChleHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4ZmZmZjtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsIGxvY2FsUmVjb3JkKSB7XG4gIGNvbnN0IG1vZGUgPSBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2VudHJhbFJlY29yZC5uYW1lLFxuICAgIG1vZGUsXG4gICAgZGF0ZTogY2VudHJhbFJlY29yZC5kYXRlLFxuICAgIGNyYzMyOiBjZW50cmFsUmVjb3JkLmNyYzMyLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGxvY2FsUmVjb3JkLmNvbnRlbnQsXG4gICAgY29tbWVudDogY2VudHJhbFJlY29yZC5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSkge1xuICBpZiAoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCAhPT0gY29tcHJlc3Npb24uU1RPUkUpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICAgIGZpbGUuY29tcHJlc3Npb25NZXRob2QsXG4gICAgICApfSBmb3IgZmlsZSAke2ZpbGUubmFtZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlRmlsZShmaWxlKSB7XG4gIGNvbnN0IG5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIG1vZGU6IGZpbGUubW9kZSAmIDBvNzc3LFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByZWFkWmlwKHJlYWRlciwgbmFtZSA9ICc8dW5rbm93bj4nKSB7XG4gIGNvbnN0IGxvY2F0b3IgPSByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcik7XG4gIGNvbnN0IGNlbnRyYWxSZWNvcmRzID0gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKTtcbiAgY29uc3QgbG9jYWxSZWNvcmRzID0gcmVhZExvY2FsRmlsZXMocmVhZGVyLCBjZW50cmFsUmVjb3Jkcyk7XG4gIGNvbnN0IGZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2VudHJhbFJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjZW50cmFsUmVjb3JkID0gY2VudHJhbFJlY29yZHNbaV07XG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBsb2NhbFJlY29yZHNbaV07XG5cbiAgICBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQsIG5hbWUpO1xuXG4gICAgaWYgKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpIHtcbiAgICAgIHRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXIgPSAoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwKSAhPT0gMDtcbiAgICBpZiAoIWlzRGlyKSB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWRGaWxlID0gZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuICAgICAgY29uc3QgZGVjb2RlZEZpbGUgPSBkZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuICAgICAgZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsIGRlY29kZWRGaWxlKTtcbiAgICB9XG4gICAgLy9cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC13cml0ZXIuanN7ImltcG9ydHMiOlsiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbIndyaXRlWmlwIiwid3JpdGVaaXBSZWNvcmRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCduYW1lJyx7dmFsdWU6XCJ3cml0ZVppcFJlY29yZHNcIn0pOyRozY9fb25jZS53cml0ZVppcFJlY29yZHMod3JpdGVaaXBSZWNvcmRzKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXAsJ25hbWUnLHt2YWx1ZTpcIndyaXRlWmlwXCJ9KTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWCA9IDM7XG5jb25zdCBVTklYX1ZFUlNJT04gPSAzMDtcblxuY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlciwgZGF0ZSkge1xuICBjb25zdCBkb3NUaW1lID1cbiAgICBkYXRlICE9PSB1bmRlZmluZWQgJiYgZGF0ZSAhPT0gbnVsbFxuICAgICAgPyAoKChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLSAxOTgwKSAmIDB4N2YpIDw8IDI1KSB8IC8vXG4gICAgICAgICgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgPDwgMjEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDRGF0ZSgpIDw8IDE2KSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ0hvdXJzKCkgPDwgMTEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDTWludXRlcygpIDw8IDUpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDU2Vjb25kcygpID4+IDEpIC8vXG4gICAgICA6IDA7IC8vXG4gIHdyaXRlci53cml0ZVVpbnQzMihkb3NUaW1lLCB0cnVlKTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlciwgZmlsZSkge1xuICAvL1xuICBjb25zdCBmaWxlU3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgLy9cbiAgd3JpdGVyLndyaXRlVWludDE2KDEwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuYml0RmxhZywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbXByZXNzaW9uTWV0aG9kLCB0cnVlKTtcbiAgd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsIGZpbGUuZGF0ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmNyYzMyLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLnVuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLm5hbWUubGVuZ3RoLCB0cnVlKTtcbiAgY29uc3QgaGVhZGVyRW5kID0gd3JpdGVyLmxlbmd0aDtcblxuICAvL1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLm5hbWUpO1xuICAvL1xuICB3cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxuICByZXR1cm4ge1xuICAgIGZpbGVTdGFydCxcbiAgICBoZWFkZXJTdGFydCxcbiAgICBoZWFkZXJFbmQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCBmaWxlLCBsb2NhdG9yKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUudmVyc2lvbik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbiAgd3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LCBsb2NhdG9yLmhlYWRlckVuZCk7XG4gIC8vXG4gIHdyaXRlci53cml0ZVVpbnQxNigwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tbWVudC5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5kaXNrTnVtYmVyU3RhcnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihsb2NhdG9yLmZpbGVTdGFydCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLmNlbnRyYWxOYW1lKTtcbiAgLy9cbiAgd3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG59XG5cbi8qXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbiAgd3JpdGVyLFxuICBlbnRyaWVzQ291bnQsXG4gIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbiAgY29tbWVudEJ5dGVzLFxuKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeVN0YXJ0LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGNvbW1lbnRCeXRlcy5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoY29tbWVudEJ5dGVzKTtcbn1cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIHJlY29yZHMsIGNvbW1lbnQgPSAnJykge1xuICAvL1xuICBjb25zdCBsb2NhdG9ycyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBsb2NhdG9ycy5wdXNoKHdyaXRlRmlsZSh3cml0ZXIsIHJlY29yZHNbaV0pKTtcbiAgfVxuXG4gIC8vXG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhdG9ycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCByZWNvcmRzW2ldLCBsb2NhdG9yc1tpXSk7XG4gIH1cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aCA9IHdyaXRlci5pbmRleCAtIGNlbnRyYWxEaXJlY3RvcnlTdGFydDtcblxuICBjb25zdCBjb21tZW50Qnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbiAgLy9cbiAgd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG4gICAgd3JpdGVyLFxuICAgIHJlY29yZHMubGVuZ3RoLFxuICAgIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuICAgIGNvbW1lbnRCeXRlcyxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUZpbGUoZmlsZSkge1xuICBjb25zdCBuYW1lID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUubmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICBjb25zdCBjb21tZW50ID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgIGNvbnRlbnQ6IGZpbGUuY29udGVudCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjcmMzMjogY3JjMzIoZmlsZS5jb250ZW50KSxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY29tcHJlc3Npb24uU1RPUkUsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb250ZW50Lmxlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29udGVudC5sZW5ndGgsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKG1vZGUpIHtcbiAgcmV0dXJuICgobW9kZSAmIDBvNzc3KSB8IDBvMTAwMDAwKSA8PCAxNjtcbn1cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbGVSZWNvcmQoZmlsZSkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICBjZW50cmFsTmFtZTogZmlsZS5uYW1lLFxuICAgIG1hZGVCeTogVU5JWCxcbiAgICB2ZXJzaW9uOiBVTklYX1ZFUlNJT04sXG4gICAgdmVyc2lvbk5lZWRlZDogMCwgLy9cbiAgICBiaXRGbGFnOiAwLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjb21wcmVzc2lvbi5TVE9SRSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY3JjMzI6IGZpbGUuY3JjMzIsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIHVuY29tcHJlc3NlZExlbmd0aDogZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsXG4gICAgZGlza051bWJlclN0YXJ0OiAwLFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXM6IDAsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlczogZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhmaWxlLm1vZGUpLFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiB3cml0ZVppcCh3cml0ZXIsIGZpbGVzLCBjb21tZW50ID0gJycpIHtcbiAgY29uc3QgZW5jb2RlZEZpbGVzID0gZmlsZXMubWFwKGVuY29kZUZpbGUpO1xuICBjb25zdCBjb21wcmVzc2VkRmlsZXMgPSBlbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4gIC8vXG4gIGNvbnN0IGZpbGVSZWNvcmRzID0gY29tcHJlc3NlZEZpbGVzLm1hcChtYWtlRmlsZVJlY29yZCk7XG4gIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIGZpbGVSZWNvcmRzLCBjb21tZW50KTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyaXRlWmlwUmVjb3JkcyI6WyJ3cml0ZVppcFJlY29yZHMiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZDKALJYGAACWBgAAHgAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyUmVhZGVyLHJlYWRaaXBGb3JtYXQ7JGjNj19pbXBvcnRzKFtbXCIuL2J1ZmZlci1yZWFkZXIuanNcIiwgW1tcIkJ1ZmZlclJlYWRlclwiLFskaM2PX2EgPT4gKEJ1ZmZlclJlYWRlciA9ICRozY9fYSldXV1dLFtcIi4vZm9ybWF0LXJlYWRlci5qc1wiLCBbW1wicmVhZFppcFwiLFskaM2PX2EgPT4gKHJlYWRaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwUmVhZGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbmFtZSA9ICc8dW5rbm93bj4nIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoZGF0YSk7XG4gICAgdGhpcy5maWxlcyA9IHJlYWRaaXBGb3JtYXQocmVhZGVyKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkKG5hbWUpIHtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5maWxlcy5nZXQobmFtZSk7XG4gICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGUuY29udGVudDtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc3RhdChuYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gICAgfTtcbiAgfVxufVxuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLiBaaXBSZWFkZXIoWmlwUmVhZGVyKTtcbiAgICAgICBjb25zdCByZWFkWmlwID0gYXN5bmMgKGRhdGEsIGxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBaaXBSZWFkZXIoZGF0YSwgeyBuYW1lOiBsb2NhdGlvbiB9KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlYWQgPSBhc3luYyBwYXRoID0+IHJlYWRlci5yZWFkKHBhdGgpO1xuICByZXR1cm4geyByZWFkIH07XG59OyRozY9fb25jZS5yZWFkWmlwKHJlYWRaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwUmVhZGVyIjpbIlppcFJlYWRlciJdLCJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3NpZ25hdHVyZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiQ0VOVFJBTF9GSUxFX0hFQURFUiIsIkRBVEFfREVTQ1JJUFRPUiIsIkxPQ0FMX0ZJTEVfSEVBREVSIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHUoc3RyaW5nKSB7XG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc3RyaW5nLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgYXJyYXlbaV0gPSBzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4gICAgICAgY29uc3QgTE9DQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAzXFx4MDQnKTskaM2PX29uY2UuTE9DQUxfRklMRV9IRUFERVIoTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgIGNvbnN0IENFTlRSQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAxXFx4MDInKTskaM2PX29uY2UuQ0VOVFJBTF9GSUxFX0hFQURFUihDRU5UUkFMX0ZJTEVfSEVBREVSKTtcbiAgICAgICBjb25zdCBDRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSB1KCdQS1xceDA1XFx4MDYnKTskaM2PX29uY2UuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKENFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgY29uc3QgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9IHUoJ1BLXFx4MDZcXHgwNycpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgIGNvbnN0IFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCA9IHUoJ1BLXFx4MDZcXHgwNicpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICBjb25zdCBEQVRBX0RFU0NSSVBUT1IgPSB1KCdQS1xceDA3XFx4MDgnKTskaM2PX29uY2UuREFUQV9ERVNDUklQVE9SKERBVEFfREVTQ1JJUFRPUik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJMT0NBTF9GSUxFX0hFQURFUiI6WyJMT0NBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0ZJTEVfSEVBREVSIjpbIkNFTlRSQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJEQVRBX0RFU0NSSVBUT1IiOlsiREFUQV9ERVNDUklQVE9SIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj63iQDQcAAA0HAAAeAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXdyaXRlci5qcyIsIi4vZm9ybWF0LXdyaXRlci5qcyJdLCJleHBvcnRzIjpbIlppcFdyaXRlciIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyV3JpdGVyLHdyaXRlWmlwRm9ybWF0OyRozY9faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIixbJGjNj19hID0+IChCdWZmZXJXcml0ZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsWyRozY9fYSA9PiAod3JpdGVaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwV3JpdGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7IGRhdGU6IG5ldyBEYXRlKCkgfSkge1xuICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3B0aW9ucztcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHRoaXMuZmlsZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kYXRlID0gZGF0ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIHdyaXRlKG5hbWUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbW9kZSA9IDBvNjQ0LCBkYXRlID0gdW5kZWZpbmVkLCBjb21tZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0aHJvdyBFcnJvcihgWmlwV3JpdGVyIHdyaXRlIHJlcXVpcmVzIGNvbnRlbnQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5maWxlcy5zZXQobmFtZSwge1xuICAgICAgbmFtZSxcbiAgICAgIG1vZGUsXG4gICAgICBkYXRlLFxuICAgICAgY29udGVudCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzbmFwc2hvdCgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKCk7XG4gICAgd3JpdGVaaXBGb3JtYXQod3JpdGVyLCBBcnJheS5mcm9tKHRoaXMuZmlsZXMudmFsdWVzKCkpKTtcbiAgICByZXR1cm4gd3JpdGVyLnN1YmFycmF5KCk7XG4gIH1cbn1cblxuLypcblxuICovJGjNj19vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbiAgICAgICBjb25zdCB3cml0ZVppcCA9ICgpID0+IHtcbiAgY29uc3Qgd3JpdGVyID0gbmV3IFppcFdyaXRlcigpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdyaXRlID0gYXN5bmMgKHBhdGgsIGRhdGEpID0+IHtcbiAgICB3cml0ZXIud3JpdGUocGF0aCwgZGF0YSk7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc25hcHNob3QgPSBhc3luYyAoKSA9PiB3cml0ZXIuc25hcHNob3QoKTtcbiAgcmV0dXJuIHsgd3JpdGUsIHNuYXBzaG90IH07XG59OyRozY9fb25jZS53cml0ZVppcCh3cml0ZVppcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJaaXBXcml0ZXIiOlsiWmlwV3JpdGVyIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAIARWdMdwAADHcAAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAH1sUNdkEAADZBAAALwAAAAAAAAAAAAAApIH5cAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjEuMC9zcmMvdmF0LXNwYXduZWQuanNQSwECHgMKAAAAAAAAAAAAONScZ3UCAAB1AgAAGwAAAAAAAAAAAAAApIEfdgAAQGVuZG8vYmFzZTY0LXYxLjAuOS9hdG9iLmpzUEsBAh4DCgAAAAAAAAAAAJLCk480AwAANAMAABsAAAAAAAAAAAAAAKSBzXgAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAAEe3Z/uQEAALkBAAAdAAAAAAAAAAAAAACkgTp8AABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAAChVqVIuQEAALkBAAAdAAAAAAAAAAAAAACkgS5+AABAZW5kby9iYXNlNjQtdjEuMC45L2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAAAAAAAAAAACkgSKAAABAZW5kby9iYXNlNjQtdjEuMC45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAAAAAAAAAAAAAKSBAIMAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2NvbW1vbi5qc1BLAQIeAwoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAAAAAAAAAAACkgXaGAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAAAAAAAAAAAApIFHjwAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAAAAAAAAAAAAAKSB8ZYAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAtwVrcH0CAAB9AgAAMQAAAAAAAAAAAAAApIFlmgAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAAAoxQXujC0AAIwtAAA2AAAAAAAAAAAAAACkgTGdAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAAAAAAAAAAAApIERywAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAAAAAAAAAAAAAKSBmc4AAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLWxpdGUuanNQSwECHgMKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAAAAAAAAAAAApIGg/AAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1BLAQIeAwoAAAAAAAAAAACXFCXU3AgAANwIAAA1AAAAAAAAAAAAAACkgTECAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAAAAAAAAAAACkgWALAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtaG9vay5qc1BLAQIeAwoAAAAAAAAAAACyboTrLgMAAC4DAAArAAAAAAAAAAAAAACkgQ9VAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzUEsBAh4DCgAAAAAAAAAAAFRdc4GPJQAAjyUAACsAAAAAAAAAAAAAAKSBhlgBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanNQSwECHgMKAAAAAAAAAAAA24zvzDwXAAA8FwAAMQAAAAAAAAAAAAAApIFefgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvbWFwLXBhcnNlci5qc1BLAQIeAwoAAAAAAAAAAACbHJrWzwsAAM8LAAA8AAAAAAAAAAAAAACkgemVAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAAAAAAAAAAAApIESogEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAAdTVibqkTAACpEwAARgAAAAAAAAAAAAAApIGwpwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAAB+v1bmRAUAAEQFAAAxAAAAAAAAAAAAAACkgb27AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAAJNW0lQeCAAAHggAADQAAAAAAAAAAAAAAKSBUMEBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAAAAAAAAAAAApIHAyQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAAB2YD3s+gQAAPoEAAAxAAAAAAAAAAAAAACkgWPPAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAAAbk/GrVGAAA1RgAADQAAAAAAAAAAAAAAKSBrNQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAA8T/NJj4qAAA+KgAALQAAAAAAAAAAAAAApIHT7QEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAK9oe6XcCAAA3AgAAC0AAAAAAAAAAAAAAKSBXBgCAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAA1AAAAAAAAAAAAAACkgYMhAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy90eXBlcy1leHRlcm5hbC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAhAAAAAAAAAAAAAACkgS4jAgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALrCJHboPAAC6DwAAKwAAAAAAAAAAAAAApIEPJQIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAAAAAAAAAAACkgRI1AgBAZW5kby9lcnJvcnMtdjEuMi4xMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADJsYMZGxYAABsWAAAjAAAAAAAAAAAAAACkgaE9AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAAAAAAAAAAACkgf1TAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAAAAAAAAAAACkgZxVAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAAAAAAAAAAAApIFyZAIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAuHaUnV8DAABfAwAAKQAAAAAAAAAAAAAApIEBdAIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAqYDDs54KAACeCgAALQAAAAAAAAAAAAAApIGndwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAAAAAAAAAAAAAKSBkIICAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAAAAAAAAAAAAAKSBNYUCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAKu2xWGKFgAAihYAACcAAAAAAAAAAAAAAKSB4ZECAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAt1VAGggcAAIIHAAAdAAAAAAAAAAAAAACkgbCoAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACVfGWZmk8AAJpPAAAqAAAAAAAAAAAAAACkgW2wAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAAAAAAAAAAAApIFPAAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAAD2GBtPQSwAAEEsAAAtAAAAAAAAAAAAAACkgYwsAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAA5otTsGgvAABoLwAAKgAAAAAAAAAAAAAApIEYWQMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAAL4ipxtKBwAASgcAAC0AAAAAAAAAAAAAAKSByIgDAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAAAAAAAAAAACkgV2QAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABKsNVd6y4AAOsuAAAlAAAAAAAAAAAAAACkgf+/AwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAAAAAAAAAAAAAKSBLe8DAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABenLPKzAUAAMwFAAAdAAAAAAAAAAAAAACkgcTwAwBAZW5kby9uYXQtdjUuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAC9HZqTQoAAE0KAAAgAAAAAAAAAAAAAACkgcv2AwBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAAAAAAAAAAACkgVYBBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAABCBRMD2CAAA9ggAACkAAAAAAAAAAAAAAKSBWAgEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAAAAAAAAAAAAAKSBlREEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAAAAAAAAAAAApIF/HQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANOikHykBgAApAYAACsAAAAAAAAAAAAAAKSBlDIEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAAAAAAAAAAAApIGBOQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAAAAAAAAAAAAAKSBn0wEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHBEXISiFwAAohcAADAAAAAAAAAAAAAAAKSBwlEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMnW2t0ysAANMrAAAqAAAAAAAAAAAAAACkgbJpBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAAAAAAAAAAAApIHNlQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAAAAAAAAAAACkgcGyBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAAAAAAAAAAAAAKSBhMEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAHRtUduUKAADlCgAAJQAAAAAAAAAAAAAApIFAygQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAAAAAAAAAAACkgWjVBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAAAAAAAAAAAAAKSBdN0EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBIucEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAAAAAAAAAAACkgbzoBABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAAAAAAAAAAAAAKSBXu8EAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAOeGs8FkJAABZCQAAKgAAAAAAAAAAAAAApIEL8gQAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAAAAAAAAAAAAAKSBrPsEAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBHgIFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAAAAAAAAAAAAAKSBugMFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAM14fpGzBwAAswcAACkAAAAAAAAAAAAAAKSBlwUFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL3NyYy90cmFtcG9saW5lLmpzUEsBAh4DCgAAAAAAAAAAALz/AUOaAgAAmgIAABkAAAAAAAAAAAAAAKSBkQ0FAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdVai6cEUAADBFAAAJQAAAAAAAAAAAAAApIFiEAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAAAAAAAAAAACkgWYlBQBAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAAAAAAAAAAAAAKSBZzUFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAAAAAAAAAAAAAKSBUDcFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NyYzMyLmpzUEsBAh4DCgAAAAAAAAAAAJmqZKueKgAAnioAACUAAAAAAAAAAAAAAKSBwzsFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAAAAAAAAAAAApIGkZgUAQGVuZG8vemlwLXYxLjAuOS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAABkMoAslgYAAJYGAAAeAAAAAAAAAAAAAACkgah9BQBAZW5kby96aXAtdjEuMC45L3NyYy9yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAAAAAAAAAAAApIF6hAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvc2lnbmF0dXJlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAAAAAAAAAAAAAKSBdIsFAEBlbmRvL3ppcC12MS4wLjkvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAKPreJANBwAADQcAAB4AAAAAAAAAAAAAAKSBB40FAEBlbmRvL3ppcC12MS4wLjkvc3JjL3dyaXRlci5qc1BLBQYAAAAAWQBZABoeAABQlAUAAAA=","endoZipBase64Sha512":"75d5796f25e0a38b9dfc9c279a33d17fafbf29c3d1e4089c972ca10e69349094b0620c0fa20f1ad0c648bff08f1b20e5fde80da83c939c93c46b2b44847c675e"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAU83kVr3AAAK9wAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vYmFzZTY0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vYmFzZTY0LXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTIzMjQyM2I5OWY2MDQxYzNhMGY3M2ZhNTQ3Yzg3MjhhYjdhZDkwN2ZmMTk2YTUwNWE3ZjZlNDA4MjFjZTkxNjEyNzY3MTU0ZDY0MzRjNTI4ODllZGRhODJmMTc1ZGIxYmQ2NzFkZDZlMDk5MWE2YTIwMTFjOTM2MjBjZTViYzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IzZWYxYjBiOTRiNzBkNTUyYTQzYmJkYTFhYzQ2ZmJhYWQ1NjhlZTAyNDgxM2U4ZTVkODIwMjVjMTE2ZDRhMTc5MzM3MTNjYjM0MDI3NTg1OWZiM2JlM2Y1YTM5NzRhZTY1NmVmMWJlYjAxYWEwZWZhMDVlODBiZTVjMDhkMDYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vdHJhbXBvbGluZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0MzQ0NDRiYzhlYzRkZjU0NzRmMjY3NzgwMzA3ZWUxNzY0NTc4MDJkY2I0OTAzMDhmYWU2ZTE2OWM1NGM0MmVlNjIyNjg1NzJkODEzMjkzOTkwYzY4NDhkNWYzNDRkOGU1OTNhNjBlNmZjOWNlMjMxZDY4ZDNlN2FmY2YxNzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwNmZjZTcxZTBjNTJiMDMyNDdmOTU5MWY4NzdmM2U4MDY3ODNiNTMyMzVhYTgxNTZkMTg5NzNiN2Q2ZGQyNTdhMWFlYjRhNzMyMjMwNzc1YjUzZDM1OTA2OTViNzhiNThlNjQxNGIyNTQzMjU2NzY4YWNmM2M5ZWY1MDI5NmJmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGNiM2YxMjAyMjMzNjUxODMwYjhlODBiOWY1ZDE3MzVjZTJlZWNjMjY5NGVhYjNhNGU1MzhhMWQwMmI3MGE0YTFjZDQyYTkzMjdjMGNjYTc4MjhmYjQyYmQzODJiZGYwNTJmOWU2N2M3ZjE4NGQxN2Y5ZDMxNzc3Mzk1MmRhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODBhNTU5ZmU5YzE2YzEwNjg2NGVjZjEyNjYwNmE0ZWQ5YWFjNGRkYmExNjEzYThhNDVhMjQ2ZWEzMWE0YzRkMjljNGU2NmM5ZjkxYzYzNDc5NDM3YzVhZWE1ZDgzZjhmN2I5NzViOTM3MzAzZTI0ZmFmNmRjYzg5ZTc4NzJjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGViODNlMDkxNjMzZTU4NDdkYzc0ZDA2NDBkYTViZGM3YjQxMGRjOTA0NzJkZTA2OWNjZTU5MmFmMWQzM2I3NTY1YTlmNDVmMmMzZWEyZmZiMWUxZDBlODBkODVlNGI3M2I1OGQyOGM2OTQ4MmNiNDg5NWI3MjM3ODJlMGY0YzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzMjQ3NjNjNjhmOGE4Y2EzNjk3NWQ5ZmRkZDgzNTQ2NzA3MTdhOWZmMWY5ODZlMTFhM2EyNjhlN2ViYzYyZjI0MTQxZDc1ZjY0YzkzMWYzMjY5OTcwYzNhNTdkMWZkOWUzMzEwOWFjMjlhM2M2OTRkMmU0Y2FhMWJlMzhkNjg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTYzNjQxYjVhODg0YTAwZWZjZTYxNmExOWYzMmM0YTNhMDcwYTI0YjRkMGM3NWMzNDVmNmQyYmYxZjc3MTY1M2FjOTQyMTYyNDRjMDlmODE4ZWY0MzU0ZjE3NGZkNGQ1MzBkZDcyYmVjYjM1MmVjN2JkMTRlYjAxM2NmZWJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkMDBiNGU0YmI3MTJkNjJhN2MxYmFiZTkxYzQ1MjRmNmFiM2Y0MzBkZWJhODRmYWNlY2ZhYTdlODU1M2RlMDNjMThkNDUwMmI4YTZkNjMzYWViM2U3YzU4ZTgxMWM5YTE2ZTU3MzRlOTQ0YjdkMjBkZWUzMTI2NzJmYTViYzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzZDcwN2ZiYTg3OGQ3NzlhZjAzMzdjOGFiMjllNzAwODY5NzYzMTkzMzZlNjg3M2M1NjQ5MjMyN2NlOWY4MWVjOTI3NzE1YzA0MTAzN2EyY2QwMjY3YjM5ZDBjZGYyNmUxMmIxN2IwODU4NmY3ZTI1ODU3ZjZjZmFjOWRmNmJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNWI4YjJhMGZkMzY4MmFmMTczYmZhYzFmNjBiNGJiY2U0OGRjMGE3MjIxZTc5MGIwMWJlNzhiMzMxMTNmODgyMWFhMDQyNDU0NTkwMmM2YmZhNjVhZWI3ODg4ZTFjNjUyZDA3YWFiMzA2OTU4NTYzMWE5YmRjYjRmYTZiYzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjZDJjZDgyZTc5OWIyYzQ0OWJlNjRjYzc3YTliOTYwMDRlN2ZhNDJhMmRmMzBhMmY2MzdiYzMzNjRmNDJmZDBjYjIzYzE5OTkwMmEzNjliYWExYmZkN2ZjYmQ4ODUwMzY5MzA1YzA4OWU3Y2U5NGZkNjMyM2JhYTg0NGUzODUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDA0NzlkZDZkNDAyMTQwNWFhYjEzMjMyZWU5ZDI5ZjE1NTQzZWJlYTU3MmNkOTgwMTJlYWJkY2MwN2M2MDQ3YWY1Nzk3NzJlODJmYzc2MmE0NWY1ZmY2YzY5MWQ1MWRkOWFkNjcxMGE2NDhkMDc3NjIyOTIzNDRhMmE4ZGEwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGY3ZDJiOGI4YjM0M2E4ZjRiYTdlNzE5NzY3NWNhYzQzZjNkYmE5MDQyMDMzN2U3MDE2MDI2ZDllMjc4ZDNiYzk1M2U5ZTgyOGE5YTczZDZiNGQ4MTQ1YTBmMGE4NmYwYjQ4NWViYjI1MWExYmY3ZWE2N2M5YmFjMzQ1Njg1MGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3NjQxMDk0MzY1OTUzNzVhNmQ2NGE1OWY5NWY3MjZlNWFhZTA4Nzg3Y2FmOWFhNTA1YTEwMWVjNmYzOTY5NGNjM2ZlZWIxODcyZDAzMDQwYTQ2ZjlkOWJhOTE2M2E1OTdlOTBiZjRkZDQwZDE5MTRmMTdmYTU1NTRlN2RkMDI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZkYTRkOWYwOWEyNTdiMzIwNzNlODhiMmIzNzAzNmY4ZTIxMmU1OWUyODJiOTk5NDZjMTkzNTdiODI5ZmFiNThlZDgxN2U2ZDQxNDQyNWU3YjZhNDVhNDI5OGE2M2U1NDdhZThhZDllZGU2NzQ2NDM1MTAxZDA4NTVjZjVkMTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMjEwMjJlNjE0ODFlZDc1YjU1NTM3ODRlODBmNDhjZTJjNWE2OTY2ZmZkMGRhNzNlZGVkOTYyNjQ4OTUzMjc4NWUzN2VhOWE1NGIyNjcwYTliZTM3ZTRkZmMyMTc3YTlhNmIzMGU1NjdlNDMzZmNlZmZiMTUwNjcwZWZjNjJhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OWEzMjNjZWExOGYxOWQ3MGYyOWQ5NGU2NjdkMGMyNzU2ZDU2NmExZjg0NjliNWY2N2MxOGRiYzg1NzM0NDkxODVmNWJmNzhmYWIwNzg2ODNiMzQ5MWRhZWNkNmIzOGUwMDkyNmM1MmM3ZjQ1MGExNzAyNmVjOWE3YzliYjY5ZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQxNTVhYTNkNDE3ZDI4N2M5OWM5ODFkMjM3YjJkYWM0NzNlMTdmZmViYWUyZjNkYWEzMjk5MWJkNjEyNzVhZjBmYWZmMDc5MDdiMzA5ZDgzZDUwYjYzNTIzZmQ5MjcwOWE3YmZlOTFlODg5YmNiYzI3MWFlNWQ4ZTJjY2JlMWZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTA3NzhmMWJlZmVjMDEwMmYwZmFjYjg3NTc3NDU5ZjgzYWJkNjZjNWQxZjkxNjA5YmI5YTMxYzM5MzQ4NGE2YTVjYzNhOTVlMTQyZTU2MjY0MWM2YWNjYTMxMjA3NjRiYTNjZmE2NTNiMjc5NmNlMzRlZDEwZjNiZWQ2NDlmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNmMjVjZmVhMWM0MzdiMzNhMTM0MjczMmNjODZjMThmMDM2MGE5YWRmOTY5YjViYzRjMTgyZmI3ZjM5NzQ5Zjk5NGM1NTEzOWU5ZTU2NTViZWJhOTdiNTQyZGMzNTMzNzUxZGEwNTg2OWUyMWVhMWUxZDA3YTgxMDA3MWViYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjM2FkNzAwZDA2NTRlNmE0ZmYyNzdhZWMyNjExNTFjOTdiOTMwMDNmZDUwMjNjOGIzYTM2ZTUxZDhiOGM1OWVjZTJlOTVlMjQ1NDBhNDQ1OTNiYjY0NGY2YjEzZmFkMGZhNjRmNGI2MmQ2MDZiYzk5MDIyZDRmYzEzMjg5YjI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMDAyZjE3NTczMmQ1NTRhNGYwNzY0YTFkMjUyOThjZmEwOTIzZTQxMWQ4OTI4NDI4OTBkZmM2NGIxOGExMzUyZWE4MmIxZDhlZTc5NmQ5Y2M4ODU1NDlmNDQ3Mzg4YzljYzNhNDlmY2UwNTdhNmIxMDkyNzM2NWM1MDRmMWUxIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjM0MjQwZDFmNzc1MTZjZTAxNTQ3ZmEyYzQyZDc0YjA3NzU5NTVjOGVlNTU3NjRiNDEzYTAwZjU0NTgyYjZiZWQ2MjVkODRkNDUyNjE5NGM5MDY1NzBkOTQ0OTY3NzA0Yzc5OTM5YzkyMTJiNjg5YmMxMWI4ODZjYmUxMmIzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZGVjMWMzMjA2Y2U4ODU4YTkxYWQxZWMwZDk4MzA5MTBhYTA2NTljYmJhNjZiZTdjMGZiODdjNTM4NzA3ZTBjZGJiYWMxMzdmYTY3NjIzMzhlMjBhNWYwODc1M2U5NTk4MzE0NDJkNmUwMjU2YWRhMWYwODdjODBkZDUwOTk0MiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS42LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NjM1MDMxMmYwZTJkYjZhNTAxMzdlNzJlOTY1ZGI4ZjZlMDI1YWMyYTNlOWMwOTEyYjJiMjcwN2MyZjUzYzAzZjlkN2JkNjM5NzgzMzY5M2QyZWU5MzMwYzUwNjI4ZWM4NDIxYzBjNzlkN2U2ODBjNGNmNWNmNjlhMDYyNDdjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhN2M4OWU1ODQzZTEwMWVmOThkMDgxOWI1MWFlYzFjNDI0ZTFkMWViNGE0MjBlNDg0NDAyNjllMDc1OGVkMzlhOGM1NTdmNGZjOTM5NGI5MWY2MDU2MTNlNmE0NTk2YzU1MmMxODM4YmUxNGZkMzBiNWJkOGExNjk4ZTg1MTU1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI0ZmJmMWRlOWRiNDExMjRjZDE1NGUzNmY5MjgyNjllNWM2MTA1NjY1NzcyMjZmM2NjNDY2ODlmYTQ3ZGE5Y2I5ODU5MjM4NWZkMjg0YzcyNDZkZjY3OGI0ODFlZTA3OGYzOGEwNjE1MmJjMDQ1ZGNkZmJiMjI1MTJiZGU0MmFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiZDc0M2U2MzFmM2Y2ZDdkOGE4Zjc4NWE1MTZhNWMyZWJiZTcwZWJjNGY3OGNkYjJhYTcwOTNhNDYzYmM5N2M4NjZjNTc5NDg2ODE4ODZlMTllZTEwMGFmNjc2NjA1NjBhODE2MGZjMTBjMzJkNTcwNDVkYjQxNmNiMTBlMzZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5YjIwZTUyMDU1ZmFjZDU3MTU2OTI4OThiODJiYTliZWVjOGU4ZjM3MzM1OTNkNWYxOTcxODlhOGNjYTEyY2M0OGE0ZDdkNGQ3ZTViZGY0NTNmNzM0NDRlNjI2ODRjZjVkMzlmMDVhNDBmMDQ2YjBmMzkwYWFiMTJlMjg0MzU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNGI1ZWNjYmI5YWZiYjZiYjJlNWZlNjEzMmM2OGQwMzQ0NGNiMDk0OTQ0ZGI3OTU3NTZlOGY0MjZmYjAyNDk1YWJhY2M5ZWYyMWQ2YTgxYTQ3NzAwZGNjZDAzNWI2MTQ0MTFmMDk1M2UzNmI1NzQ3NTkyYjUyNTUyZDIzNzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzQ3ODRhMzhhMzRkNTYxMzMxNmZjYzc2OGJkMzQzNTA5ZGIzODhhZWZhNTg0M2I2ZjA3MGQxMzhjNTI3OThjODBjMjYwZGZkN2E1NTZjOWVkNGNmZjNmNjgwNDUxOTNjM2RjMTM3YjM5YmRmNjYyZDFkMzQ0M2M0NWY1YzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3MDUyOTJjZjcxZWE3ZjkxZTY1YzFlOTBjMDA3NDA4YmEwMThlODVlYTBlZjJlNzRlM2Y5OGMyOWJkYTRjNjA5NGI4ZTRlYjM4ODc1MjhjNmE2YzE5ZmZkYzFmNGI4OWZjZDQxMjNlNzMwMzAxYmRmNmE0YjY3OTU1MGNlYjQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3MzFjODI0YjFkOWI0MTc3ZmIzZmViNWExZWIwN2ExYzVkZjNjYTFlYTQ3NmExZTU1ODZlMTBjYjNmOTNjMTRkM2Q0MzZmOTE0ODk2MTkzMjkyMWVlZWYyM2ViZTMwZmI2YmIyMzMwNDRmYmVlYjc2YzZmOGUzMzU0YjllNmU1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ODQzMTYzYTc0YjkyZGUxMDZjMjI5ZTAxZTdkYWI3M2VlYzExMTdlMzgxNThkYTg1MzYyYWY5Y2ExMGZkOGVjNmZmODU3ZjlhMzliNGUyYTM3YmE2YTZiMGQ5MmY3NjM1MzA1MmE1MGFlZWQ5YzUwMDZiNDYyZTZkNjRiY2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM2YzIzOGMzMGE5ZmY4NjYzZmQyNmI1NzhiYjkzZWMyMGRkNjVhYWE3ZWNkYTRjYzI4MzU2Nzk0OTE0NjQ1ODkxZGY4Zjc5ZTFiMjMyMjZhODQ5YTA3ZDRhOWY1ZGRlMzUzOTk1MzQyNmE5ZWE0MWY2MzhiZTY4ZjIxNDdkYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1YmE5ZWVkMjFhYjYzZWEyZDA5ZmUyZTEyN2E0NjFjYzhhM2ViMTc4YmNmN2NmMTk1YTdmNGJhMjNhMDI1YzU4NjM3MjFjNjE5ZTQ0ZWY5NzU1MTgyM2ZhMzg4ZDI1ZjRjZDEwNTRjYjJhYzhhNjFhMGMxMWZjMzcyMWM2MGY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGI2MTQwYjdjZTkwOTJmODZmNWYyMTE5ZDg3MTcxMjUyNGUyYTRlZGMzMjBlMDk3MjkyZmNiOGExYjViZjc5OWE3ZDJkZjAyOTA3Y2VkZGVhMmEyZmMzMmZjMDBiNGU5MjgzOWNjYmI2NThiNzVlNDQwMzI5MTA1ZjgxYWM5YWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhZTJmMWY0MjYwMGJiOTcyOGVjMWQxZTdhY2U3ZTUzYTRmNjlkMzZkZTVhOGZjZmJjODUwZmM0ZmRhOGJlYjQ2MzdiYTYwYTVlYTBjNmNmYTBlZjVjYjlhMWQ4MjE2MWE3NzNkZDQ3ZTRkNGU3NjZjY2E2NTU4ODg4M2U5MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYWVmZDllMjM3MDlmZDFjZWM4ZDZkZDFlZDBhYzEyNTI1OWFlM2E4YmNhYTJiOTE4YmIzNzNhNjllN2VmNzlhMzljZDZkOWNmNjY3NDM2Njc2NzQ5NGUzOTM4MzMyZDI3MDM3MTA0MmY4MjMyNGM4MzQ2YmU1ODU3MThkN2JjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZTg3NTRjMjk4OTNiZGY4OGFlZDI5YzI2ZmFjMDczYjUwYTJmMDEyZWE5YzZjNDBhNTI0MTQwY2ZmY2VhZWE0YjllMmJlNGQ0NjRlMjczYmZhODRjY2QyN2RjMzQ5NzdkYzc2NzJhNDNlZmEzM2IyYTIyODg0NTFhMWEwMjE5NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ1ZjJjOWQ4YzQxZjFiOGJhOTg3ZWI4NzRjMjYzNTA5YjIyZDkwYWZhM2EzZjNiYjg4MWRiOWYwZTgwYmE2YTNiMzkzYTkzMGViYjI5MWU2ZjQ3M2VlNTYwNTMwZmNjZWVmM2YzMWZkMzYwZmUzMTI1OTEyNWFlZmE0ODc4ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJmNGFmOGY2OWNmMWQ0OWY3YmFmOWNhNDQyNzM0Y2M3OWI5NzJiOTk3YmRlMWIwZjhjODcwNDlhOWViZDRiZGY0ZjE2MWJmNzRkN2Q3ZGFkMTg4MTBiOWVhZGQxODIwNjhmNjIwMmQzNDZhMGJlNTBmNWM2NDI3YzA5NzA3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZjN2FmMmY2YTgxYWNlYWJmNTk5YjAxYjdiZjU2YWE2NzQ2NzQ5NGU4NTEyNTAxOWU1YjhiNTFkZmMwMWVmMGQ2NTk3OWY5MmY1ZTZiY2MzMGM1YTEyN2ExZWYxNjliOWNhOWU0ODcxODM3YmUxYjQ3MGIyODg2ZjdkYmU1Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGZjY2YwNjY3NmEwZjU1NjdkNzE3MzViZGJiZjE5OTk0NjQ4NjRhNGYyNGFhZjVjZTY1ZjE3OWZiOWM3YzcxNjMxNDVlMjE1OTE3ZWIzYjMwMWE2Zjg0YWNjY2UwZDFkMTg2YzlmNjRjOThiNmIzZTdmY2E5ZDY1M2FjOWI4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2MDk3MWVkZGVjOWU5MzZiMjEyNzQ5MmZiYzZhMmQ1MDAwZTRmNGE1OTAzZTNmMTI4NmFmZjM4ODIzYmU2NTcyNWRiMjJiMDE0OGMzYzM2MjhkZGJhZWI2MzdmM2U0NDk2OWY0M2FjYTM3YjAyZjJkZDVjOGQyM2I4Zjc0YTY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU1MzE1YTY0YmZkMzE4YWY5YjM1MGU0M2FhZGRlZjYxOGI5ZTA1MjMyMjdkZGI0MWRmM2IzNmJhNzA4NzYwMDQ1YjRjNGUxMmY4YmIwYzdlNTRhYzI0YmFkZDIxM2UwY2Y5ZDVjMDQzNmZkZDM4ZGJhNzBiNDg3MTYyYTI5MjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTAwMTQyODc0MTBiNzJjZjcwODhkMjY1ODQ2NjAxNzExNjcxM2Y0ZDE0MDdkY2E5NzE5ODkyNjk2NTY1ZDBhYmIxMmFmMTY0NTZlMjRkYTkxYzhhMjYyMGUwNThkMDZiOTBmOGI1MTA1ZTM1YzY5NzZiMDcwNDVmN2U1YzMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjdmMTFlYWVhNjE0YzE5MWY5OGM4ZDU3ZmM3MTQ5ZWY4ODM4MDMzN2JmZjQ5Y2FkOTM0YzdiM2ZmMWZhYjNhMDhiZTc0ZjY2ZmZlYTk1YWFhMmI5YzQ0M2IzZmUwNWNkN2Y5MDE3NWY4MzY3ZmViODc0NWJiYzI0MTg3MjczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTZkY2EwM2E2OTRhYjdkYTg5OWNjY2FiMzhkNDdjMDYxODYwYjI2ZjFkNzI5MjlmMzBhZDY4NDE5MWY4MDc0M2Y4NTc3OGY0YWIwYTZjYjQ1ZDA5YzBlZWIzMGM0OThhYWIzOGE0OWM2NGU5NmFiYTRhNTQxODZkZDgyYzA4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjQ2NTMzMDdmODA2ZjEzYjJhZGI1OTZiYjZlMjRjYWZlOGYwODM0NDJmOGI1MGIzMmEwZWNhYjFhZjhkZWU1MmI2YTliODNlNjRiYzJkNjZiZDVkZDQyM2RkZjA2YTEyMTQxZjlhYjhlNjRjYjI2MTQwNjRlZTY1MmQwNDAwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2QzYTI1NjM2ZTU0Mjc4YjMzZjZjMzYyMTQ3ODg5ZTZmZjEwYmVkYTgwYzA3ZTZhMTZkMTkwNDdiN2IzYzZhMzRkNzMwZTliM2NmYzlmODUxMWI2ZTI3YjZhNjk3NzY0Zjk2ODNkNzBkZjcwODZlMDg1ZjkzZDdmOTVmYzRmZmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmViMGMxYTI0OTY2ZDRhYmZmYTJjMThjMmZiMjhkZDUwNGRjYjNiNzIzZDgzMDBjMTBlOTQzOTQ0OTNjNTRlMTgwMjQ1MjdmZGU3MDFkN2VkNTkzYjI2NWU0NTZkMmQ0OGMxNWUwZDUwMTAxMDhlZmQxODcyYjc0YTI1MTRjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Yzg0ZDA3NmUwYTQxOWZjODYzN2FiMzhmMjQ0MzM4YzQ3NmM1MDEzMmNmZTA5MDAyZGRkY2JiZmNkMzY1YmY2Y2YzZDMyYjA5ZGEzMjUyNWY3NWI2MGY1ZmM2NjBkZGMwZTA4ZjM2YTYwN2JhMDc3ZjU5OWJjNTVmMjllY2IzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3RyYW1wb2xpbmUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0ZWFiOWFmZjc5ZTMyZDc0ZmNlOWZiYmQ1OGJmOGRjZWZkMDU2NGRiYjRkYmNlZGE5ZWJhYWM1NWY2MWUxZTMxZGViNTE1YWNmYTZjYzQzNmM3NjE4NmJlY2E2ODM0ODgxY2ZhM2Y1MmE3YjhiZDc2YTY5YjNjZDkxNjJhMjI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW1wb2xpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW1wb2xpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYmFlM2E2ZWFhYTkzNmU0YmFjYjc0YTlkZDM4ZWM1OGU4OTU3YTEyYTQwODk3NGUyMzM4MjJiZjYxNzEyZmY4MzYwMGY5OGRlOTI3YTRkM2M0NGY0ODNlMTZiNjA0ZjgxNzQ0MmUwMjdkMTdkYTk1YmYzNjY4ZTAwMzQ5NjQ5NiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmRmZGI3YWQ4NDNhNzE4ODhiNTZhZTZmZGMzMWQ0MjJlMjUxMzE4ZDY4OWE4MWJhNjZmYjNkNTM0MWQwMTgzMzg5YzVhZTg4ZDZlYjA2OGMxNDA0OGQ1NzQzNDkxNzc5ZDUzNDkwNzQxYWFkMjkxYjlkZmNhMGJmYmJhNjgyODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllZjk1NGVhYzIwYzVlMTljMmY2ZDE4MzNjMmI1M2JkM2MzZmMxMDA0MDA4N2U3YmM3ZDY0YTJiM2ZjNTkzMzVjNjJkZWMxZGQ4YzBjY2RiMDI1ZWZkYmFjOTFiMzQ3ZTQzZjJiMzI0ZTNkOTE1NmU2N2JhZWQxN2ExNDNkZjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZTc5NjhhYzZlYjg1YTVmMDVjOGM2ZTRkNjJmZjY0YTY4YWM5NDQ1MjkyN2QzY2FkZWJkYTE3ZDAzYTk1MWZmMTkzN2EyZjU3NDNiMTVlNjlhNDU1NDM5ODJlMTdjOWE4MWJmMzRjM2NhZTI2MzUzY2MxY2JiZjQzMTI1NzcyYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZjZlMjM5ZTY0YWU2ZDk2M2IyMDhjODllZjc5ZWNjYWM4YzVhNjYzMzQ4N2NiZjY1ODNkNmY2NDdmYTlmM2VhNDVlNTlhZjRkODRjZmU4ZWFlNzliZDdkMTIyY2JjMmMyNzA4ZTYyOTAyNjc5MTI2YmYyMjFlYjZkZWRmZWU3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OWI3NDE3ZGE4ZGU2YTYzMTgyMDJhZTYzZGVjZDI5ZTYwMjNjOWY1ZmZlMTdkMWYyZmUxYTA2MGZlZDlmYzE4OGViMDljYTdmNWRlMDk1OGE3MzFmNGE0MmM4Njk2M2ZhODkxZTJhNmE2YTQyZDJlNzA2MWRlMjg0NmM1ZGRiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1MWQ1OWZhN2FkOTRjMjRhZjljMTBkZDRkMzYxMzNiNjUzNWNhYzIyYjI3Y2I5YmJiMjYxN2FhOWUwMmU5ZTdmZjhhMTkyODcxMmVhODM3OWMzMjhkMjc5OWJkOTA0ZTJjMGRmOWM5YzVhMmY1MjlkZjk2OGQ1NTVjZDhiMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNzQ4M2MwODgxNjlkZTlhY2RkZDlhZjEwZjViYzRiZTBiMzU4YjRjZDg0M2VjNzE3OWFiYzMwMDJhZDBhMmQ4OTQ2OGZlZjliNTNhMzg3YjA3ZTE1ZjViZDg0MzAxMmRiZGY4M2YwOWNjOWNkY2EwNTlkYTVjMDkyNTUzYWY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg3MDM0Yjg3ZjRlYzNlMjkzZTIxMjgzNjAwNGFiNWM5NTkwZTg2YTI1ZGMyZDc2ZWM4MWVjNzI5YzUwYzlkYTUyODQxMDY1ZmNhNDM0MzRjMWJkMDc5MjZkZDQ3NDIwMDNmNWUzODYwYTU3ZDM0NmVlMTdiZmRiZjhkNzdhZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGFlZDBmNGFiMWIxNWM5ODE2NGIxNGZkYTM1YTJmOTcwNjQ3Zjc1M2UwMTlmNzEwYmY1ZGRlOTVmZTQ0OTNiM2ZmMTExOWNmMWRmNDQ1MzdkYzE1NDNkZDdiNDJlNjcwYjRhMDVhMzVhYjBmNTI4ZGM2NjA0YzFmMWQzYjg4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MTA5MjlmZWFkZDYwYTZhYjIyNTUxZWQ0OWIwN2VlZjNmNjA3NDhlODYyMTBlMDA1NTU1MWRiNDlhYWUyNzViODI3Mjc0MTUxZjliOGQ4NjFiZTY5NDZmYmNkMjc5ZWJhMDVlYjIwZWQyM2MxNjhjYTY2ZGY5OTVlYjBlZDNlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAH1sUNdkEAADZBAAAKQAAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW1wb3J0QnVuZGxlLEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ltcG9ydC1idW5kbGVcIiwgW1tcImltcG9ydEJ1bmRsZVwiLFskaM2PX2EgPT4gKGltcG9ydEJ1bmRsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkUm9vdE9iamVjdCwnbmFtZScse3ZhbHVlOlwiYnVpbGRSb290T2JqZWN0XCJ9KTskaM2PX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7XG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHMgPSB7XG4gIFZhdERhdGEsXG4gIGNvbnNvbGUsXG4gIC8vXG4gIGFzc2VydDogZ2xvYmFsVGhpcy5hc3NlcnQsXG4gIEJhc2U2NDogZ2xvYmFsVGhpcy5CYXNlNjQsIC8vXG4gIFVSTDogZ2xvYmFsVGhpcy5VUkwgIC8vXG59O1xuXG4gICAgICAgZnVuY3Rpb24gYnVpbGRSb290T2JqZWN0KCkge1xuICByZXR1cm4gRmFyKCdyb290Jywge1xuICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKSB7XG4gICAgICBjb25zdCBucyA9IGF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUsIHsgZW5kb3dtZW50cyB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0Rm4gPSBucy5kZWZhdWx0O1xuICAgICAgcmV0dXJuIEZhcignc3Bhd25lZCBidW5kbGUnLCB7XG4gICAgICAgIGFzeW5jIHN0YXJ0KGFyZ3NQKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IGFyZ3NQO1xuICAgICAgICAgIHJldHVybiBzdGFydEZuKGFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADjUnGd1AgAAdQIAABsAAABAZW5kby9iYXNlNjQtdjEuMC45L2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVjb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXRvYiA9IGVuY29kZWREYXRhID0+IHtcbiAgY29uc3QgYnVmID0gZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbn07JGjNj19vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAksKTjzQDAAA0AwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc3siaW1wb3J0cyI6WyIuL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbImJ0b2EiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBlbmNvZGVCYXNlNjQ7JGjNj19pbXBvcnRzKFtbXCIuL2VuY29kZS5qc1wiLCBbW1wiZW5jb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBidG9hID0gc3RyaW5nVG9FbmNvZGUgPT4ge1xuICBjb25zdCBieXRlcyA9IHN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG4gICAgY29uc3QgYiA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoYiA+IDB4ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBiO1xuICB9KTtcbiAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICByZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG59OyRozY9fb25jZS5idG9hKGJ0b2EpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAR7dn+5AQAAuQEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoValSLkBAAC5AQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiLCIuL3NyYy9kZWNvZGUuanMiLCIuL2J0b2EuanMiLCIuL2F0b2IuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9jb21tb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFscGhhYmV0NjQiLCJtb25vZHU2NCIsInBhZGRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuICAgICAgIGNvbnN0IHBhZGRpbmcgPSAnPSc7JGjNj19vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAgICBjb25zdCBhbHBoYWJldDY0ID1cbiAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuICAgICAgIGNvbnN0IG1vbm9kdTY0ID0ge307JGjNj19vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgYWxwaGFiZXQ2NC5sZW5ndGg7IGkgKz0gMSkge1xuICBjb25zdCBjID0gYWxwaGFiZXQ2NFtpXTtcbiAgbW9ub2R1NjRbY10gPSBpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0IiwianNEZWNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtb25vZHU2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsWyRozY9fYSA9PiAobW9ub2R1NjQgPSAkaM2PX2EpXV0sW1wicGFkZGluZ1wiLFskaM2PX2EgPT4gKHBhZGRpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0RlY29kZUJhc2U2NCA9IChzdHJpbmcsIG5hbWUgPSAnPHVua25vd24+JykgPT4ge1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKChzdHJpbmcubGVuZ3RoICogNCkgLyAzKSk7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcbiAgbGV0IGkgPSAwOyAvL1xuICBsZXQgaiA9IDA7IC8vXG5cbiAgd2hpbGUgKGkgPCBzdHJpbmcubGVuZ3RoICYmIHN0cmluZ1tpXSAhPT0gcGFkZGluZykge1xuICAgIGNvbnN0IG51bWJlciA9IG1vbm9kdTY0W3N0cmluZ1tpXV07XG4gICAgaWYgKG51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuICAgIH1cbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA2KSB8IG51bWJlcjtcbiAgICBxdWFudHVtICs9IDY7XG4gICAgaWYgKHF1YW50dW0gPj0gOCkge1xuICAgICAgcXVhbnR1bSAtPSA4O1xuICAgICAgZGF0YVtqXSA9IHJlZ2lzdGVyID4+PiBxdWFudHVtO1xuICAgICAgaiArPSAxO1xuICAgICAgcmVnaXN0ZXIgJj0gKDEgPDwgcXVhbnR1bSkgLSAxO1xuICAgIH1cbiAgICBpICs9IDE7XG4gIH1cblxuICB3aGlsZSAocXVhbnR1bSA+IDApIHtcbiAgICBpZiAoaSA9PT0gc3RyaW5nLmxlbmd0aCB8fCBzdHJpbmdbaV0gIT09IHBhZGRpbmcpIHtcbiAgICAgIHRocm93IEVycm9yKGBNaXNzaW5nIHBhZGRpbmcgYXQgb2Zmc2V0ICR7aX0gb2Ygc3RyaW5nICR7bmFtZX1gKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIGkgKz0gMTtcbiAgICBxdWFudHVtIC09IDI7XG4gIH1cblxuICBpZiAoaSA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbiAgICAgICAgaSxcbiAgICAgICl9IGluIHN0cmluZyAke25hbWV9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgaik7XG59O1xuXG4vL1xuLy9cbiRozY9fb25jZS5qc0RlY29kZUJhc2U2NChqc0RlY29kZUJhc2U2NCk7Y29uc3QgYWRhcHREZWNvZGVyPVxuICBuYXRpdmVEZWNvZGVCYXNlNjQgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBkZWNvZGVkID0gbmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGVkKTtcbiAgfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVjb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZFxuICAgID8gYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSlcbiAgICA6IGpzRGVjb2RlQmFzZTY0OyRozY9fb25jZS5kZWNvZGVCYXNlNjQoZGVjb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRGVjb2RlQmFzZTY0IjpbImpzRGVjb2RlQmFzZTY0Il0sImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImVuY29kZUJhc2U2NCIsImpzRW5jb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIixbJGjNj19hID0+IChhbHBoYWJldDY0ID0gJGjNj19hKV1dLFtcInBhZGRpbmdcIixbJGjNj19hID0+IChwYWRkaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0VuY29kZUJhc2U2NCA9IGRhdGEgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBsZXQgc3RyaW5nID0gJyc7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBiID0gZGF0YVtpXTtcbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA4KSB8IGI7XG4gICAgcXVhbnR1bSArPSA4O1xuICAgIGlmIChxdWFudHVtID09PSAyNCkge1xuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxOCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMikgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA2KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDApICYgMHgzZl07XG4gICAgICByZWdpc3RlciA9IDA7XG4gICAgICBxdWFudHVtID0gMDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHF1YW50dW0pIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDIpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA8PCA0KSAmIDB4M2ZdICtcbiAgICAgICAgcGFkZGluZyArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE2OlxuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA0KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPDwgMikgJiAweDNmXSArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5qc0VuY29kZUJhc2U2NChqc0VuY29kZUJhc2U2NCk7XG4gICAgICAgY29uc3QgZW5jb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZCA/IGdsb2JhbFRoaXMuQmFzZTY0LmVuY29kZSA6IGpzRW5jb2RlQmFzZTY0OyRozY9fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRW5jb2RlQmFzZTY0IjpbImpzRW5jb2RlQmFzZTY0Il0sImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1hcCA9IChvcmlnaW5hbCwgbWFwRm4pID0+IHtcbiAgY29uc3QgZW50cyA9IGVudHJpZXMob3JpZ2luYWwpO1xuICBjb25zdCBtYXBFbnRzID0gZW50cy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gLyogICAgICAgICAgICAgICAgICAgICAgICovIChbaywgbWFwRm4odiwgayldKSxcbiAgKTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3BWtwfQIAAH0CAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyIsIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanNcIiwgW11dLFtcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACjFBe6MLQAAjC0AADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRQYWNrYWdlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFja2FnZVBvbGljeSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbiAgICAgICBjb25zdCBzdHJpbmdDb21wYXJlID0gKGEsIGIpID0+IChhID09PSBiID8gMCA6IGEgPCBiID8gLTEgOiAxKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2Uuc3RyaW5nQ29tcGFyZShzdHJpbmdDb21wYXJlKTtcbmNvbnN0IGN1bXVsYXRpdmVMZW5ndGggPSAobGVuZ3RoLCB0ZXJtKSA9PiB7XG4gIHJldHVybiBsZW5ndGggKyB0ZXJtLmxlbmd0aDtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgcGF0aENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvL1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8vXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgfVxuICAvL1xuICBjb25zdCBhU3VtID0gYS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwgMCk7XG4gIGNvbnN0IGJTdW0gPSBiLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLCAwKTtcbiAgaWYgKGFTdW0gIT09IGJTdW0pIHtcbiAgICByZXR1cm4gYVN1bSAtIGJTdW07XG4gIH1cbiAgLy9cbiAgYXNzZXJ0KGEubGVuZ3RoID09PSBiLmxlbmd0aCk7IC8vXG4gIC8vXG4gIC8vXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGNvbXBhcmlzb24gPSBzdHJpbmdDb21wYXJlKGFbaV0sIGJbaV0pO1xuICAgIGlmIChjb21wYXJpc29uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29tcGFyaXNvbjtcbiAgICB9XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIDA7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5wYXRoQ29tcGFyZShwYXRoQ29tcGFyZSk7XG5mdW5jdGlvbiogZW51bWVyYXRlKGl0ZXJhYmxlKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBbaW5kZXgsIHZhbHVlXTtcbiAgICBpbmRleCArPSAxO1xuICB9XG59XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdCA9IChvYmplY3QsIG1lc3NhZ2UpID0+IHtcbiAgYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoID09PSAwLCBtZXNzYWdlKTtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMsIHVybCkgPT4ge1xuICBpZiAoY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGFzc2VydChcbiAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpLFxuICAgIGBjb25kaXRpb25zIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke2NvbmRpdGlvbnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgZW51bWVyYXRlKGNvbmRpdGlvbnMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgY29uZGl0aW9uc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIG1vZHVsZSwgcmV0YWluZWQsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoe1xuICAgICAgZXh0cmEsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICB9KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBtb2R1bGUsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobW9kdWxlKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgaWYgKHJldGFpbmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgcmV0YWluZWQsXG4gICAgICAnYm9vbGVhbicsXG4gICAgICBgJHtwYXRofS5yZXRhaW5lZCBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cShyZXRhaW5lZCl9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZSA9IChhbGxlZ2VkTW9kdWxlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgeyBsb2NhdGlvbiwgcGFyc2VyLCBzaGE1MTIsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBwYXJzZXIsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EocGFyc2VyKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBpZiAoc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgc2hhNTEyLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgZXhpdCwgLi4uZXh0cmEgfSA9IGFsbGVnZWRNb2R1bGU7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGV4aXQsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBtb2R1bGVEZXNjcmlwdG9yID0gT2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZSA9PT0gbW9kdWxlRGVzY3JpcHRvciAmJiAhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7IGNvbXBhcnRtZW50LCBtb2R1bGUsIGxvY2F0aW9uLCBwYXJzZXIsIGV4aXQsIGRlZmVycmVkRXJyb3IgfSA9XG4gICAgbW9kdWxlRGVzY3JpcHRvcjtcbiAgaWYgKGNvbXBhcnRtZW50ICE9PSB1bmRlZmluZWQgfHwgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGxvY2F0aW9uICE9PSB1bmRlZmluZWQgfHwgcGFyc2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IsIHBhdGgsIHVybCk7XG4gIH0gZWxzZSBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBkZWZlcnJlZEVycm9yLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBtb2R1bGUgZGVzY3JpcHRvciwgZ290ICR7cShhbGxlZ2VkTW9kdWxlKX0gaW4gJHtxKFxuICAgICAgICB1cmwsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcyA9IChhbGxlZ2VkTW9kdWxlcywgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IG1vZHVsZXMgPSBPYmplY3QoYWxsZWdlZE1vZHVsZXMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZXMgPT09IG1vZHVsZXMgfHwgIUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gICAgYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xuICAgIGFzc2VydE1vZHVsZSh2YWx1ZSwgYCR7cGF0aH0ubW9kdWxlc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2VycyA9IChhbGxlZ2VkUGFyc2VycywgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkUGFyc2VycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhcnNlcnMgPSBPYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZFBhcnNlcnMgPT09IHBhcnNlcnMgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VycyksXG4gICAgYCR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBhcnNlcnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VycykpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAga2V5LFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGUgPSAoYWxsZWdlZFNjb3BlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBPYmplY3QoYWxsZWdlZFNjb3BlKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZSA9PT0gc2NvcGUgJiYgIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuICAgIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgLi4uZXh0cmEgfSA9IHNjb3BlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGVzID0gKGFsbGVnZWRTY29wZXMsIHBhdGgsIHVybCkgPT4ge1xuICBpZiAoYWxsZWdlZFNjb3BlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNjb3BlcyA9IE9iamVjdChhbGxlZ2VkU2NvcGVzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZXMgPT09IHNjb3BlcyAmJiAhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuICAgIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY29wZXMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIGtleSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VHlwZXMgPSAoYWxsZWdlZFR5cGVzLCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRUeXBlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHR5cGVzID0gT2JqZWN0KGFsbGVnZWRUeXBlcyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkVHlwZXMgPT09IHR5cGVzICYmICFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiAgICBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBrZXksXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5ID0gKFxuICBhbGxlZ2VkUG9saWN5LFxuICBwYXRoLFxuICB1cmwgPSAnPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+JyxcbikgPT4ge1xuICBhc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsIHVybCk7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudCA9IChhbGxlZ2VkQ29tcGFydG1lbnQsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudCA9IE9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnQpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50ID09PSBjb21wYXJ0bWVudCAmJiAhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7XG4gICAgbG9jYXRpb24sXG4gICAgbmFtZSxcbiAgICBsYWJlbCxcbiAgICBwYXJzZXJzLFxuICAgIHR5cGVzLFxuICAgIHNjb3BlcyxcbiAgICBtb2R1bGVzLFxuICAgIHBvbGljeSxcbiAgICAuLi5leHRyYVxuICB9ID0gY29tcGFydG1lbnQ7XG5cbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbmFtZSxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGxhYmVsLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmxhYmVsIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsYWJlbCl9YCxcbiAgKTtcblxuICBhc3NlcnRNb2R1bGVzKG1vZHVsZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBhcnNlcnMocGFyc2VycywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0U2NvcGVzKHNjb3BlcywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0VHlwZXModHlwZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBvbGljeShwb2xpY3ksIHBhdGgsIHVybCk7XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzID0gKGFsbGVnZWRDb21wYXJ0bWVudHMsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBPYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRzID09PSBjb21wYXJ0bWVudHMgfHwgIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRzKSxcbiAgICBgY29tcGFydG1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRDb21wYXJ0bWVudHMpfSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKSB7XG4gICAgYXNzZXJ0Q29tcGFydG1lbnQodmFsdWUsIGBjb21wYXJ0bWVudHNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbnRyeSA9IChhbGxlZ2VkRW50cnksIHVybCkgPT4ge1xuICBjb25zdCBlbnRyeSA9IE9iamVjdChhbGxlZ2VkRW50cnkpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZEVudHJ5ID09PSBlbnRyeSAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gICAgYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgbW9kdWxlLCAuLi5leHRyYSB9ID0gZW50cnk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbW9kdWxlLFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke21vZHVsZX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IGFzc2VydENvbXBhcnRtZW50TWFwID0gKFxuICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG4gIHVybCA9ICc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nLFxuKSA9PiB7XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwID0gT2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAgPT09IGNvbXBhcnRtZW50TWFwICYmICFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiAgICBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHtcbiAgICAvL1xuICAgIC8vXG4gICAgdGFnczogY29uZGl0aW9ucyxcbiAgICBlbnRyeSxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgLi4uZXh0cmFcbiAgfSA9IE9iamVjdChjb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydENvbmRpdGlvbnMoY29uZGl0aW9ucywgdXJsKTtcbiAgYXNzZXJ0RW50cnkoZW50cnksIHVybCk7XG4gIGFzc2VydENvbXBhcnRtZW50cyhjb21wYXJ0bWVudHMsIHVybCk7XG59OyRozY9fb25jZS5hc3NlcnRDb21wYXJ0bWVudE1hcChhc3NlcnRDb21wYXJ0bWVudE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VFeHRlbnNpb24gPSBsb2NhdGlvbiA9PiB7XG4gIGNvbnN0IGxhc3RTbGFzaCA9IGxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG4gIGlmIChsYXN0U2xhc2ggPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IGJhc2UgPSBsb2NhdGlvbi5zbGljZShsYXN0U2xhc2ggKyAxKTtcbiAgY29uc3QgbGFzdERvdCA9IGJhc2UubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGxhc3REb3QgPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBiYXNlLnNsaWNlKGxhc3REb3QgKyAxKTtcbn07JGjNj19vbmNlLnBhcnNlRXh0ZW5zaW9uKHBhcnNlRXh0ZW5zaW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3ppcCIsIi4vbGluay5qcyIsIi4vanNvbi5qcyIsIi4vcG93ZXJzLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vaW1wb3J0LWhvb2suanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFppcFJlYWRlcixsaW5rLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwLGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIsYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIixbJGjNj19hID0+IChaaXBSZWFkZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIixbJGjNj19hID0+IChsaW5rID0gJGjNj19hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsWyRozY9fYSA9PiAoam9pbiA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLFskaM2PX2EgPT4gKGFzc2VydENvbXBhcnRtZW50TWFwID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtaG9vay5qc1wiLCBbW1wiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlclwiLFskaM2PX2EgPT4gKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuY29uc3QgeyBhc3NpZ24sIGNyZWF0ZSwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBwb3N0cG9uZUVycm9yVG9FeGVjdXRlID0gZXJyb3JNZXNzYWdlID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cblxuICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgIGltcG9ydHM6IFtdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyID0gKFxuICBnZXQsXG4gIGNvbXBhcnRtZW50cyxcbiAgYXJjaGl2ZUxvY2F0aW9uLFxuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lLFxuICAgIGF0dGVudWF0b3JzXG4gICAgLy9cbiAgICAvL1xuICB9KSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbiAgICBjb25zdCB7IG1vZHVsZXMgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0SG9vayA9IGFzeW5jIG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbiAgICAgIGlmIChtb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICl9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBhd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxuICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShcbiAgICAgICAgICAgICAgYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG4gICAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShtb2R1bGUuZGVmZXJyZWRFcnJvcik7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLnBhcnNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZXIgPSBwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHBhcnNlIH0gPSBwYXJzZXI7XG4gICAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbiAgICAgIGNvbnN0IG1vZHVsZUJ5dGVzID0gZ2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuICAgICAgaWYgKGNvbXB1dGVTaGE1MTIgIT09IHVuZGVmaW5lZCAmJiBtb2R1bGUuc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG4gICAgICAgIGlmIChzaGE1MTIgIT09IG1vZHVsZS5zaGE1MTIpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShcbiAgICAgICAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgICAgICAgKX0gZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZUxvY2F0aW9uID0gYGZpbGU6Ly8vJHttb2R1bGVMb2NhdGlvbn1gO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPSBgLi4uLyR7am9pbihiYXNlLCBtb2R1bGVTcGVjaWZpZXIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZVNvdXJjZUxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPVxuICAgICAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIG1vZHVsZVNwZWNpZmllcikgfHxcbiAgICAgICAgICBzb3VyY2VMb2NhdGlvbjtcbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZU1hcFVybDtcbiAgICAgIGlmIChcbiAgICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbW9kdWxlLnNoYTUxMiAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgc291cmNlTWFwVXJsID0gY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgIG1vZHVsZTogbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIGxvY2F0aW9uOiBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgICBzaGE1MTI6IG1vZHVsZS5zaGE1MTIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgY29uc3QgeyByZWNvcmQgfSA9IGF3YWl0IHBhcnNlKFxuICAgICAgICBtb2R1bGVCeXRlcyxcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlTWFwVXJsLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyByZWNvcmQsIHNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyIH07XG4gICAgfTtcbiAgICByZXR1cm4gaW1wb3J0SG9vaztcbiAgfTtcbiAgcmV0dXJuIG1ha2VJbXBvcnRIb29rO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VBcmNoaXZlID0gYXN5bmMgKFxuICBhcmNoaXZlQnl0ZXMsXG4gIGFyY2hpdmVMb2NhdGlvbiA9ICc8dW5rbm93bj4nLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgYXdhaXQgbnVsbDtcbiAgY29uc3Qge1xuICAgIGNvbXB1dGVTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgZXhwZWN0ZWRTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbiA9IENvbXBhcnRtZW50LFxuICAgIG1vZHVsZXMgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0SG9vazogZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uID0ge30sXG4gICAgX19uYXRpdmVfXyA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiksXG4gICk7XG5cbiAgY29uc3QgYXJjaGl2ZSA9IG5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLCB7IG5hbWU6IGFyY2hpdmVMb2NhdGlvbiB9KTtcblxuICAvL1xuICBjb25zdCB1bnNlZW4gPSBuZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbiAgdW5zZWVuLnNpemUgPj0gMiB8fFxuICAgIEZhaWxgQXJjaGl2ZSBmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhIGNvbXBhcnRtZW50IG1hcCBmaWxlIGFuZCBvbmUgbW9kdWxlIGZpbGUgaW4gJHtxKFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICl9YDtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBnZXQgPSBwYXRoID0+IHtcbiAgICB1bnNlZW4uZGVsZXRlKHBhdGgpO1xuICAgIHJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gIH07XG5cbiAgY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcyA9IGdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxuICBsZXQgc2hhNTEyO1xuICBpZiAoY29tcHV0ZVNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgfVxuICBpZiAoZXhwZWN0ZWRTaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzaGE1MTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaGE1MTIgIT09IGV4cGVjdGVkU2hhNTEyKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEFyY2hpdmUgY29tcGFydG1lbnQgbWFwIGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrLCBleHBlY3RlZCAke2V4cGVjdGVkU2hhNTEyfSwgZ290ICR7c2hhNTEyfSwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwVGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgY29uc3QgY29tcGFydG1lbnRNYXAgPSBwYXJzZUxvY2F0ZWRKc29uKFxuICAgIGNvbXBhcnRtZW50TWFwVGV4dCxcbiAgICAnY29tcGFydG1lbnQtbWFwLmpzb24nLFxuICApO1xuICBhc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCwgYXJjaGl2ZUxvY2F0aW9uKTtcblxuICBjb25zdCB7XG4gICAgY29tcGFydG1lbnRzLFxuICAgIGVudHJ5OiB7IG1vZHVsZTogZW50cnlNb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50OiBlbnRyeUNvbXBhcnRtZW50TmFtZSB9LFxuICB9ID0gY29tcGFydG1lbnRNYXA7XG5cbiAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgIG1vZHVsZXMsXG4gICAgZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gIH0pO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtYWtlSW1wb3J0SG9vayA9IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuICAgICAgZ2V0LFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgeyBjb21wYXJ0bWVudCwgcGVuZGluZ0pvYnNQcm9taXNlIH0gPSBsaW5rKGNvbXBhcnRtZW50TWFwLCB7XG4gICAgICBtYWtlSW1wb3J0SG9vayxcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyhtb2R1bGVzIHx8IHt9KS5tYXAoc3BlY2lmaWVyID0+IHtcbiAgICAgICAgICByZXR1cm4gW3NwZWNpZmllciwgeyBuYW1lc3BhY2U6IHt9IH1dO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbixcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbiAgICBhd2FpdCBjb21wYXJ0bWVudC5sb2FkKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgICB1bnNlZW4uc2l6ZSA9PT0gMCB8fFxuICAgICAgRmFpbGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbiAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgKX1gO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBhc3luYyBvcHRpb25zID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24gPSBDb21wYXJ0bWVudFBhcnNlT3B0aW9uLFxuICAgICAgX19uYXRpdmVfXyxcbiAgICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgICAgbW9kdWxlcyxcbiAgICAgIGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gICAgfSk7XG4gICAgY29uc3QgbWFrZUltcG9ydEhvb2sgPSBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbiAgICAgIGdldCxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICAgIGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgKTtcbiAgICBjb25zdCB7IGNvbXBhcnRtZW50LCBwZW5kaW5nSm9ic1Byb21pc2UgfSA9IGxpbmsoY29tcGFydG1lbnRNYXAsIHtcbiAgICAgIG1ha2VJbXBvcnRIb29rLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24sXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG4gICAgLy9cbiAgICByZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgfTtcblxuICByZXR1cm4geyBpbXBvcnQ6IGV4ZWN1dGUsIHNoYTUxMiB9O1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnBhcnNlQXJjaGl2ZShwYXJzZUFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGxvYWRBcmNoaXZlID0gYXN5bmMgKFxuICByZWFkUG93ZXJzLFxuICBhcmNoaXZlTG9jYXRpb24sXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHJlYWQsIGNvbXB1dGVTaGE1MTIgfSA9IHVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG4gIGNvbnN0IHtcbiAgICBleHBlY3RlZFNoYTUxMixcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24sXG4gICAgbW9kdWxlcyxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhcmNoaXZlQnl0ZXMgPSBhd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG4gIHJldHVybiBwYXJzZUFyY2hpdmUoYXJjaGl2ZUJ5dGVzLCBhcmNoaXZlTG9jYXRpb24sIHtcbiAgICBjb21wdXRlU2hhNTEyLFxuICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICBtb2R1bGVzLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubG9hZEFyY2hpdmUobG9hZEFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGltcG9ydEFyY2hpdmUgPSBhc3luYyAocmVhZFBvd2VycywgYXJjaGl2ZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpO1xuICByZXR1cm4gYXJjaGl2ZS5pbXBvcnQob3B0aW9ucyk7XG59OyRozY9fb25jZS5pbXBvcnRBcmNoaXZlKGltcG9ydEFyY2hpdmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VBcmNoaXZlIjpbInBhcnNlQXJjaGl2ZSJdLCJsb2FkQXJjaGl2ZSI6WyJsb2FkQXJjaGl2ZSJdLCJpbXBvcnRBcmNoaXZlIjpbImltcG9ydEFyY2hpdmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanN7ImltcG9ydHMiOlsiLi9wYXJzZS1wcmUtY2pzLmpzIiwiLi9wYXJzZS1qc29uLmpzIiwiLi9wYXJzZS10ZXh0LmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzOyRozY9faW1wb3J0cyhbW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VySnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKHBhcnNlclRleHQgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJQcmVNanMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gT2JqZWN0LmZyZWV6ZShcbiAgLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgICAncHJlLWNqcy1qc29uJzogcGFyc2VyUHJlQ2pzLFxuICAgICdwcmUtbWpzLWpzb24nOiBwYXJzZXJQcmVNanMsXG4gICAganNvbjogcGFyc2VySnNvbixcbiAgICB0ZXh0OiBwYXJzZXJUZXh0LFxuICAgIGJ5dGVzOiBwYXJzZXJCeXRlcyxcbiAgfSksXG4pOyRozY9fb25jZS5kZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSI6WyJkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlxQl1NwIAADcCAAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qcyIsIi4vaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSxwYXJzZUFyY2hpdmVMaXRlLGxvYWRBcmNoaXZlTGl0ZSxpbXBvcnRBcmNoaXZlTGl0ZTskaM2PX2ltcG9ydHMoW1tcIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1wiLCBbW1wiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlXCIsWyRozY9fYSA9PiAoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzXCIsIFtbXCJwYXJzZUFyY2hpdmVcIixbJGjNj19hID0+IChwYXJzZUFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImxvYWRBcmNoaXZlXCIsWyRozY9fYSA9PiAobG9hZEFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImltcG9ydEFyY2hpdmVcIixbJGjNj19hID0+IChpbXBvcnRBcmNoaXZlTGl0ZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2UgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UsIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcbiAgcmV0dXJuIHsgLi4ucmVzdCwgcGFyc2VyRm9yTGFuZ3VhZ2UgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlQXJjaGl2ZSA9IGFzeW5jIChcbiAgYXJjaGl2ZUJ5dGVzLFxuICBhcmNoaXZlTG9jYXRpb24gPSAnPHVua25vd24+JyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PlxuICBwYXJzZUFyY2hpdmVMaXRlKFxuICAgIGFyY2hpdmVCeXRlcyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbiAgICAgICBjb25zdCBsb2FkQXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+XG4gIGxvYWRBcmNoaXZlTGl0ZShcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICBhc3NpZ25QYXJzZXJGb3JMYW5ndWFnZShvcHRpb25zKSxcbiAgKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbiAgICAgICBjb25zdCBpbXBvcnRBcmNoaXZlID0gYXN5bmMgKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucykgPT5cbiAgaW1wb3J0QXJjaGl2ZUxpdGUoXG4gICAgcmVhZFBvd2VycyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb2xpY3kuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydE5vd0hvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzeW5jVHJhbXBvbGluZSxzeW5jVHJhbXBvbGluZSxyZXNvbHZlLGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZW5mb3JjZU1vZHVsZVBvbGljeSx1bnBhY2tSZWFkUG93ZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wiYXN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoYXN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcInN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLFskaM2PX2EgPT4gKHJlc29sdmUgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIixbJGjNj19hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRozY9fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsWyRozY9fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VJbXBvcnROb3dIb29rTWFrZXIsJ25hbWUnLHt2YWx1ZTpcIm1ha2VJbXBvcnROb3dIb29rTWFrZXJcIn0pOyRozY9fb25jZS5tYWtlSW1wb3J0Tm93SG9va01ha2VyKG1ha2VJbXBvcnROb3dIb29rTWFrZXIpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzLCBhc3NpZ24sIGNyZWF0ZSB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLypcblxuXG4gKi9cbmNvbnN0IGhhcyA9IChoYXlzdGFjaywgbmVlZGxlKSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgaGF5c3RhY2ssIFtuZWVkbGVdKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uID0gKHJlbCwgYWJzKSA9PiBuZXcgVVJMKHJlbCwgYWJzKS50b1N0cmluZygpO1xuXG4vL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSB7XG4gIHJldHVybiAoaGFzKHJlY29yZCwgJ3JlY29yZCcpID8gcmVjb3JkLnJlY29yZC5pbXBvcnRzIDogcmVjb3JkLmltcG9ydHMpIHx8IFtdO1xufVxuXG4vL1xuLy9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyA9IFtcbiAgLy9cbiAgJy5qcycsXG4gICcuanNvbicsXG4gICcubm9kZScsXG4gIC8vXG4gICcvaW5kZXguanMnLFxuICAnL2luZGV4Lmpzb24nLFxuICAnL2luZGV4Lm5vZGUnLFxuXTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZmluZFJlZGlyZWN0ID0gKHtcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICBjb21wYXJ0bWVudHMsXG4gIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyLFxuICBwYWNrYWdlTG9jYXRpb24sXG59KSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllckxvY2F0aW9uID0gbmV3IFVSTChcbiAgICBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICkuaHJlZjtcblxuICAvL1xuICBsZXQgc29tZUxvY2F0aW9uID0gbmV3IFVSTCgnLi8nLCBtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbikuaHJlZjtcblxuICAvL1xuICAvL1xuXG4gIC8vXG4gIGZvciAoOzspIHtcbiAgICBpZiAoXG4gICAgICBzb21lTG9jYXRpb24gIT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UICYmXG4gICAgICBzb21lTG9jYXRpb24gaW4gY29tcGFydG1lbnRzXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHNvbWVMb2NhdGlvbjtcbiAgICAgIGNvbnN0IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChjb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoY29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKFxuICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMoXG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLmxvY2F0aW9uLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9ySGludDogYEJsb2NrZWQgaW4gaW1wb3J0IGhvb2suICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtsb2NhdGlvbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKGFic29sdXRlTW9kdWxlU3BlY2lmaWVyKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHBhcmVudExvY2F0aW9uID0gbmV3IFVSTCgnLi4vJywgc29tZUxvY2F0aW9uKS5ocmVmO1xuXG4gICAgICAvL1xuICAgICAgaWYgKHBhcmVudExvY2F0aW9uID09PSBzb21lTG9jYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgaW1wb3J0IHVua25vd24gbW9kdWxlOiAke3EoYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNvbWVMb2NhdGlvbiA9IHBhcmVudExvY2F0aW9uO1xuICAgIH1cbiAgfVxufTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gKHtcbiAgbW9kdWxlcyA9IHVuZGVmaW5lZCxcbiAgZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gIGVudHJ5Q29tcGFydG1lbnROYW1lLFxufSkgPT4ge1xuICBpZiAoIW1vZHVsZXMgJiYgIWV4aXRNb2R1bGVJbXBvcnRIb29rKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXN5bmMgc3BlY2lmaWVyID0+IHtcbiAgICBpZiAobW9kdWxlcyAmJiBoYXMobW9kdWxlcywgc3BlY2lmaWVyKSkge1xuICAgICAgY29uc3QgbnMgPSBtb2R1bGVzW3NwZWNpZmllcl07XG4gICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgaW1wb3J0czogW10sXG4gICAgICAgIGV4cG9ydHM6IG5zID8ga2V5cyhucykgOiBbXSxcbiAgICAgICAgZXhlY3V0ZTogbW9kdWxlRXhwb3J0cyA9PiB7XG4gICAgICAgICAgbW9kdWxlRXhwb3J0cy5kZWZhdWx0ID0gbnM7XG4gICAgICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIG5zKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBleGl0TW9kdWxlSW1wb3J0SG9vayhzcGVjaWZpZXIsIGVudHJ5Q29tcGFydG1lbnROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcik7XG5jb25zdCBub21pbmF0ZUNhbmRpZGF0ZXMgPSAobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBjYW5kaWRhdGVzID0gW21vZHVsZVNwZWNpZmllcl07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKSB7XG4gICAgY2FuZGlkYXRlcy5wdXNoKGAke21vZHVsZVNwZWNpZmllcn0ke2NhbmRpZGF0ZVN1ZmZpeH1gKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiogY2hvb3NlTW9kdWxlRGVzY3JpcHRvcihcbiAge1xuICAgIGNhbmRpZGF0ZXMsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgY29tcGFydG1lbnRzLFxuICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlU291cmNlcyxcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVPbmx5LFxuICAgIHNvdXJjZU1hcEhvb2ssXG4gICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICB9LFxuICB7IG1heWJlUmVhZCwgcGFyc2UsIHNob3VsZERlZmVyRXJyb3IgPSAoKSA9PiBmYWxzZSB9LFxuKSB7XG4gIGNvbnN0IHsgc291cmNlRGlybmFtZSB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVNwZWNpZmllciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW2NhbmRpZGF0ZVNwZWNpZmllcl07XG4gICAgaWYgKGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvbXBhcnRtZW50OiBjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWUgPSBwYWNrYWdlTG9jYXRpb24gfSA9XG4gICAgICAgIGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuICAgICAgaWYgKGNhbmRpZGF0ZUNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50IG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IgPVxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG4gICAgICBpZiAoY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdID1cbiAgICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbiAgICAgIC8vXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICBzcGVjaWZpZXI6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgY29tcGFydG1lbnQ6IGNhbmRpZGF0ZUNvbXBhcnRtZW50LFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihjYW5kaWRhdGVTcGVjaWZpZXIsIHBhY2thZ2VMb2NhdGlvbik7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbW9kdWxlQnl0ZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICB5aWVsZCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pXG4gICAgKTtcblxuICAgIGlmIChtb2R1bGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGxldCBzb3VyY2VNYXA7XG4gICAgICAvL1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHlpZWxkIHBhcnNlKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICAgIGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vazpcbiAgICAgICAgICAgICAgc291cmNlTWFwSG9vayAmJlxuICAgICAgICAgICAgICAobmV4dFNvdXJjZU1hcE9iamVjdCA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwID0gSlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgYnl0ZXM6IHRyYW5zZm9ybWVkQnl0ZXMsXG4gICAgICAgIHJlY29yZDogY29uY3JldGVSZWNvcmQsXG4gICAgICB9ID0gZW52ZWxvcGU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGNhbmRpZGF0ZVNwZWNpZmllciAhPT0gbW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgIG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl0gPSB7XG4gICAgICAgICAgcmV0YWluZWQ6IHRydWUsXG4gICAgICAgICAgbW9kdWxlOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgICAgY29tcGFydG1lbnQ6IHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgcmVjb3JkOiBjb25jcmV0ZVJlY29yZCxcbiAgICAgICAgc3BlY2lmaWVyOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydE1ldGE6IHsgdXJsOiBtb2R1bGVMb2NhdGlvbiB9LFxuICAgICAgfTtcblxuICAgICAgbGV0IHNoYTUxMjtcbiAgICAgIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuICAgICAgICBpZiAoc291cmNlTWFwSG9vayAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc291cmNlTWFwSG9vayhzb3VyY2VNYXAsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBtb2R1bGU6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICAgIHNoYTUxMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uLnNsaWNlKFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl0gPSB7XG4gICAgICAgIGxvY2F0aW9uOiBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbiAgICAgICAgc291cmNlTG9jYXRpb246IG1vZHVsZUxvY2F0aW9uLFxuICAgICAgICBzb3VyY2VEaXJuYW1lLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIGJ5dGVzOiB0cmFuc2Zvcm1lZEJ5dGVzLFxuICAgICAgICByZWNvcmQ6IGNvbmNyZXRlUmVjb3JkLFxuICAgICAgICBzaGE1MTIsXG4gICAgICB9O1xuICAgICAgaWYgKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbiAgICAgICAgICAgIHJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLCBtb2R1bGVTcGVjaWZpZXIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUltcG9ydEhvb2tNYWtlciA9IChcbiAgcmVhZFBvd2VycyxcbiAgYmFzZUxvY2F0aW9uLFxuICB7XG4gICAgc291cmNlcyA9IGNyZWF0ZShudWxsKSxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBzb3VyY2VNYXBIb29rID0gdW5kZWZpbmVkLFxuICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgIGVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rID0gdW5kZWZpbmVkLFxuICB9LFxuKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmljdGx5UmVxdWlyZWQgPSBuZXcgTWFwKFtcbiAgICBbZW50cnlDb21wYXJ0bWVudE5hbWUsIG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldLFxuICBdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lOiBfcGFja2FnZU5hbWUsXG4gICAgYXR0ZW51YXRvcnMsXG4gICAgcGFyc2UsXG4gICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICAvL1xuICAgIHBhY2thZ2VMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIGJhc2VMb2NhdGlvbik7XG4gICAgY29uc3QgcGFja2FnZVNvdXJjZXMgPSBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gfHwgY3JlYXRlKG51bGwpO1xuICAgIHNvdXJjZXNbcGFja2FnZUxvY2F0aW9uXSA9IHBhY2thZ2VTb3VyY2VzO1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvciA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXSB8fCB7fTtcbiAgICBjb25zdCB7IG1vZHVsZXM6IG1vZHVsZURlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVEZXNjcmlwdG9ycztcblxuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVmZXJFcnJvciA9IChzcGVjaWZpZXIsIGVycm9yKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgICAgICBpbXBvcnRzOiBbXSxcbiAgICAgICAgZXhwb3J0czogW10sXG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXSA9IHtcbiAgICAgICAgZGVmZXJyZWRFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRIb29rID0gYXN5bmMgbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICBhd2FpdCBudWxsO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAhPT0gJy4nICYmICFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgICAgICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2soXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChhcmNoaXZlT25seSkge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplKHsgaW1wb3J0czogW10sIGV4cG9ydHM6IFtdLCBleGVjdXRlKCkge30gfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29uc3QgYXR0ZW51YXRlZFJlY29yZCA9IGF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG4gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gYXR0ZW51YXRlZFJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1heWJlUmVhZCB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcblxuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbm9taW5hdGVDYW5kaWRhdGVzKG1vZHVsZVNwZWNpZmllciwgc2VhcmNoU3VmZml4ZXMpO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFzeW5jVHJhbXBvbGluZShcbiAgICAgICAgICBjaG9vc2VNb2R1bGVEZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgICByZWFkUG93ZXJzLFxuICAgICAgICAgICAgYXJjaGl2ZU9ubHksXG4gICAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtYXliZVJlYWQsIHBhcnNlLCBzaG91bGREZWZlckVycm9yIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZmlsZSBmb3IgaW50ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSAod2l0aCBjYW5kaWRhdGVzICR7Y2FuZGlkYXRlc1xuICAgICAgICAgICAgLm1hcCh4ID0+IHEoeCkpXG4gICAgICAgICAgICAuam9pbignLCAnKX0pIGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZlckVycm9yKG1vZHVsZVNwZWNpZmllciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGltcG9ydEhvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0SG9vaztcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZUltcG9ydEhvb2tNYWtlcihtYWtlSW1wb3J0SG9va01ha2VyKTtcbiAgICAgICBmdW5jdGlvbiBtYWtlSW1wb3J0Tm93SG9va01ha2VyKFxuICByZWFkUG93ZXJzLFxuICBiYXNlTG9jYXRpb24sXG4gIHtcbiAgICBzb3VyY2VzID0gY3JlYXRlKG51bGwpLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBhcmNoaXZlT25seSA9IGZhbHNlLFxuICAgIHNvdXJjZU1hcEhvb2sgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0Tm93SG9vazogZXhpdE1vZHVsZUltcG9ydE5vd0hvb2sgPSB1bmRlZmluZWQsXG4gIH0sXG4pIHtcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaWN0bHlSZXF1aXJlZCA9IG5ldyBNYXAoKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IG1ha2VJbXBvcnROb3dIb29rID0gKHtcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgcGFja2FnZU5hbWU6IF9wYWNrYWdlTmFtZSxcbiAgICBwYXJzZSxcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICBpZiAoISgnaXNTeW5jUGFyc2VyJyBpbiBwYXJzZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlVHJhbnNmb3JtSW1wb3J0Tm93SG9vaygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEeW5hbWljIHJlcXVpcmVzIGFyZSBvbmx5IHBvc3NpYmxlIHdpdGggc3luY2hyb25vdXMgcGFyc2VycyBhbmQgbm8gYXN5bmNocm9ub3VzIG1vZHVsZSB0cmFuc2Zvcm1zIGluIG9wdGlvbnMnLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG5cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCB7XG4gICAgICBtb2R1bGVzOlxuICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgICAgICBjcmVhdGUobnVsbClcbiAgICAgICAgKSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBsZXQgeyBwb2xpY3kgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBwb2xpY3kgPSBwb2xpY3kgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKCdwYWNrYWdlcycgaW4gcG9saWN5ICYmIHR5cGVvZiBwb2xpY3kucGFja2FnZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeUl0ZW1dIG9mIGVudHJpZXMocG9saWN5LnBhY2thZ2VzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcykgJiZcbiAgICAgICAgICBwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3Iuc2NvcGVzICYmXG4gICAgICAgICAgcGFja2FnZVBvbGljeUl0ZW1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbcGFja2FnZU5hbWVdID1cbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5zY29wZXNbcGFja2FnZU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBtYXliZVJlYWROb3csIGlzQWJzb2x1dGUgfSA9IHJlYWRQb3dlcnM7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0Tm93SG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBpZiAoaXNBYnNvbHV0ZShtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGZpbmRSZWRpcmVjdCh7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5vbWluYXRlQ2FuZGlkYXRlcyhtb2R1bGVTcGVjaWZpZXIsIHNlYXJjaFN1ZmZpeGVzKTtcblxuICAgICAgY29uc3QgcmVjb3JkID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICAgIGNob29zZU1vZHVsZURlc2NyaXB0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICBhcmNoaXZlT25seSxcbiAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1heWJlUmVhZDogbWF5YmVSZWFkTm93LFxuICAgICAgICAgIHBhcnNlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydE5vd0hvb2spIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXhpdFJlY29yZCA9IGV4aXRNb2R1bGVJbXBvcnROb3dIb29rKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFleGl0UmVjb3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKG1vZHVsZVNwZWNpZmllcil9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdFJlY29yZDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGltcG9ydCBtb2R1bGU6ICR7cShcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICl9OyB0cnkgcHJvdmlkaW5nIGFuIGltcG9ydE5vd0hvb2tgLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGltcG9ydE5vd0hvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0Tm93SG9vaztcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydE5vd0hvb2tNYWtlciI6WyJtYWtlSW1wb3J0Tm93SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALJuhOsuAwAALgMAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUxvY2F0ZWRKc29uID0gKHNvdXJjZSwgbG9jYXRpb24pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICB0aHJvdyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07JGjNj19vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVF1zgY8lAACPJQAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9tYXAtcGFyc2VyLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNYXBQYXJzZXJzLHJlc29sdmVGYWxsYmFjayxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLGVuZm9yY2VNb2R1bGVQb2xpY3ksbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFwLXBhcnNlci5qc1wiLCBbW1wibWFrZU1hcFBhcnNlcnNcIixbJGjNj19hID0+IChtYWtlTWFwUGFyc2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsWyRozY9fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsWyRozY9fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaM2PX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLFskaM2PX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXNzaWduLCBjcmVhdGUsIGVudHJpZXMsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGFsbFNldHRsZWQgfSA9IFByb21pc2U7XG5cbi8qXG5cblxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZCA9IGFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgZGVmYXVsdENvbXBhcnRtZW50ID0gQ29tcGFydG1lbnQ7XG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW2tleV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeCA9IChtb2R1bGVTcGVjaWZpZXIsIHByZWZpeCkgPT4ge1xuICBpZiAobW9kdWxlU3BlY2lmaWVyID09PSBwcmVmaXgpIHtcbiAgICByZXR1cm4gJy4nO1xuICB9XG4gIGlmIChtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKSB7XG4gICAgcmV0dXJuIGAuLyR7bW9kdWxlU3BlY2lmaWVyLnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKX1gO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlTW9kdWxlTWFwSG9vayA9IChcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudHMsXG4gIGNvbXBhcnRtZW50TmFtZSxcbiAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gIHNjb3BlRGVzY3JpcHRvcnMsXG4pID0+IHtcbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBtb2R1bGVNYXBIb29rID0gbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG4gICAgaWYgKG1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9IGNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgbW9kdWxlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBleGl0LFxuICAgICAgfSA9IG1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vXG4gICAgICB9XG4gICAgICBpZiAoZm9yZWlnbk1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmICghbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvckhpbnQ6XG4gICAgICAgICAgICAgICdUaGlzIGNoZWNrIHNob3VsZCBub3QgYmUgcmVhY2hhYmxlLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnQsXG4gICAgICAgICAgbmFtZXNwYWNlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IFtzY29wZVByZWZpeCwgc2NvcGVEZXNjcmlwdG9yXSBvZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKSB7XG4gICAgICBjb25zdCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyID0gdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzY29wZVByZWZpeCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3JlaWduTW9kdWxlU3BlY2lmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSB9ID0gc2NvcGVEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGltcG9ydCBmcm9tIHNjb3BlICR7c2NvcGVQcmVmaXh9IGR1ZSB0byBtaXNzaW5nIFwiY29tcGFydG1lbnRcIiBwcm9wZXJ0eWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsaW5raW5nLiAke3EoXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgKX0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke3EoXG4gICAgICAgICAgICBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgICl9LmAsXG4gICAgICAgIH0pO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBtb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdID0ge1xuICAgICAgICAgIHJldGFpbmVkOiB0cnVlLFxuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgIG1vZHVsZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50LFxuICAgICAgICAgIG5hbWVzcGFjZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICByZXR1cm4gbW9kdWxlTWFwSG9vaztcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgaW1wb3NzaWJsZUltcG9ydE5vd0hvb2tNYWtlciA9ICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGltcG9zc2libGVJbXBvcnROb3dIb29rKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZWQgcmVhZCBwb3dlcnMgZG8gbm90IHN1cHBvcnQgZHluYW1pYyByZXF1aXJlcycpO1xuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbGluayA9IChcbiAgeyBlbnRyeSwgY29tcGFydG1lbnRzOiBjb21wYXJ0bWVudERlc2NyaXB0b3JzIH0sXG4gIG9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHJlc29sdmUgPSByZXNvbHZlRmFsbGJhY2ssXG4gICAgbWFrZUltcG9ydEhvb2ssXG4gICAgbWFrZUltcG9ydE5vd0hvb2sgPSBpbXBvc3NpYmxlSW1wb3J0Tm93SG9va01ha2VyLFxuICAgIHBhcnNlckZvckxhbmd1YWdlOiBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiA9IHt9LFxuICAgIGdsb2JhbHMgPSB7fSxcbiAgICB0cmFuc2Zvcm1zID0gW10sXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICBfX3NoaW1UcmFuc2Zvcm1zX18gPSBbXSxcbiAgICBfX25hdGl2ZV9fID0gZmFsc2UsXG4gICAgYXJjaGl2ZU9ubHkgPSBmYWxzZSxcbiAgICBDb21wYXJ0bWVudCA9IGRlZmF1bHRDb21wYXJ0bWVudCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudDogZW50cnlDb21wYXJ0bWVudE5hbWUgfSA9IGVudHJ5O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBjcmVhdGUobnVsbCk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXR0ZW51YXRvcnMgPSBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICApO1xuXG4gIGNvbnN0IHBlbmRpbmdKb2JzID0gW107XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGFyc2VyRm9yTGFuZ3VhZ2UgPSBmcmVlemUoXG4gICAgYXNzaWduKGNyZWF0ZShudWxsKSwgcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24pLFxuICApO1xuXG4gIGNvbnN0IG1hcFBhcnNlcnMgPSBtYWtlTWFwUGFyc2Vycyh7XG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29tcGFydG1lbnROYW1lLCBjb21wYXJ0bWVudERlc2NyaXB0b3JdIG9mIGVudHJpZXMoXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbmFtZSxcbiAgICAgIHBhcnNlcnM6IGxhbmd1YWdlRm9yRXh0ZW5zaW9uID0ge30sXG4gICAgICB0eXBlczogbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgPSB7fSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgc2NvcGVzOiBfc2NvcGVzLCBtb2R1bGVzOiBfbW9kdWxlcyB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbnN0IG1vZHVsZXMgPSBfbW9kdWxlcyB8fCBjcmVhdGUobnVsbCk7XG4gICAgY29uc3Qgc2NvcGVzID0gX3Njb3BlcyB8fCBjcmVhdGUobnVsbCk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhcnNlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgbWFwUGFyc2VycyhsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpXG4gICAgKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzaG91bGREZWZlckVycm9yID0gbGFuZ3VhZ2UgPT4ge1xuICAgICAgaWYgKGxhbmd1YWdlICYmIGhhcyhwYXJzZXJGb3JMYW5ndWFnZSwgbGFuZ3VhZ2UpKSB7XG4gICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdKVxuICAgICAgICAgIC5oZXVyaXN0aWNJbXBvcnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcmVzb2x2ZUhvb2sgPSByZXNvbHZlO1xuICAgIGNvbnN0IGltcG9ydEhvb2sgPSBtYWtlSW1wb3J0SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBhdHRlbnVhdG9ycyxcbiAgICAgIHBhcnNlLFxuICAgICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydE5vd0hvb2sgPSBtYWtlSW1wb3J0Tm93SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBwYXJzZSxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZHVsZU1hcEhvb2sgPSBtYWtlTW9kdWxlTWFwSG9vayhcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGNvbXBhcnRtZW50TmFtZSxcbiAgICAgIG1vZHVsZXMsXG4gICAgICBzY29wZXMsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHtcbiAgICAgIG5hbWU6IGxvY2F0aW9uLFxuICAgICAgcmVzb2x2ZUhvb2ssXG4gICAgICBpbXBvcnRIb29rLFxuICAgICAgaW1wb3J0Tm93SG9vayxcbiAgICAgIG1vZHVsZU1hcEhvb2ssXG4gICAgICB0cmFuc2Zvcm1zLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgaWYgKCFhcmNoaXZlT25seSkge1xuICAgICAgYXR0ZW51YXRlR2xvYmFscyhcbiAgICAgICAgY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbiAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV0gPSBjb21wYXJ0bWVudDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbiAgaWYgKGNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgYXNzZW1ibGUgY29tcGFydG1lbnQgZ3JhcGggYmVjYXVzZSB0aGUgcm9vdCBjb21wYXJ0bWVudCBuYW1lZCAke3EoXG4gICAgICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgICAgKX0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF07XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudCxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCxcbiAgICBwZW5kaW5nSm9ic1Byb21pc2U6IHByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyByZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0c1xuICAgICAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIHJlc3VsdCA9PlxuICAgICAgICAgICAgICByZXN1bHQucmVhc29uLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYEdsb2JhbHMgYXR0ZW51YXRpb24gZXJyb3JzOiAke2Vycm9yc1xuICAgICAgICAgICAgICAubWFwKGVycm9yID0+IGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApLFxuICB9O1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5saW5rKGxpbmspO1xuICAgICAgIGNvbnN0IGFzc2VtYmxlID0gKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKSA9PlxuICBsaW5rKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKS5jb21wYXJ0bWVudDskaM2PX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGluayI6WyJsaW5rIl0sImFzc2VtYmxlIjpbImFzc2VtYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANuM78w8FwAAPBcAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9tYXAtcGFyc2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3RyYW1wb2xpbmUiLCIuL2V4dGVuc2lvbi5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXBQYXJzZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgc3luY1RyYW1wb2xpbmUsYXN5bmNUcmFtcG9saW5lLHBhcnNlRXh0ZW5zaW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wic3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChzeW5jVHJhbXBvbGluZSA9ICRozY9fYSldXSxbXCJhc3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChhc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4dGVuc2lvbi5qc1wiLCBbW1wicGFyc2VFeHRlbnNpb25cIixbJGjNj19hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBrZXlzLCBoYXNPd25Qcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuLy9cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlID0gZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gJ2pzJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXIgPSAoXG4gIHByZWZlclN5bmNocm9ub3VzLFxuICBsYW5ndWFnZUZvckV4dGVuc2lvbixcbiAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdHJhbnNmb3JtcztcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgZnVuY3Rpb24qIGdldFBhcnNlckdlbmVyYXRvcihcbiAgICBieXRlcyxcbiAgICBzcGVjaWZpZXIsXG4gICAgbG9jYXRpb24sXG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIG9wdGlvbnMsXG4gICkge1xuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBsYW5ndWFnZTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbiAgICBpZiAoXG4gICAgICAhZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikgJiZcbiAgICAgIGhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciwgc3BlY2lmaWVyKVxuICAgICkge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXSB8fCBleHRlbnNpb247XG4gICAgfVxuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzb3VyY2VNYXA7XG5cbiAgICBpZiAoaGFzKHRyYW5zZm9ybXMsIGxhbmd1YWdlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHtcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBwYXJzZXI6IGxhbmd1YWdlLFxuICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgfSA9IHlpZWxkIHRyYW5zZm9ybXNbbGFuZ3VhZ2VdKFxuICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgc291cmNlTWFwLFxuICAgICAgICAgIH0sXG4gICAgICAgICkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBFcnJvciB0cmFuc2Zvcm1pbmcgJHtxKGxhbmd1YWdlKX0gc291cmNlIGluICR7cShsb2NhdGlvbil9OiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgeyBjYXVzZTogZXJyIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYXJzZSB9ID0gcGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xuICAgIHJldHVybiBwYXJzZShieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCB7XG4gICAgICBzb3VyY2VNYXAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3Qgc3luY1BhcnNlciA9IChieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICBnZXRQYXJzZXJHZW5lcmF0b3IsXG4gICAgICBieXRlcyxcbiAgICAgIHNwZWNpZmllcixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGlmICgndGhlbicgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1N5bmMgcGFyc2VyIGNhbm5vdCByZXR1cm4gYSBUaGVuYWJsZTsgZW5zdXJlIHBhcnNlciBpcyBhY3R1YWxseSBzeW5jaHJvbm91cycsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBzeW5jUGFyc2VyLmlzU3luY1BhcnNlciA9IHRydWU7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXN5bmNQYXJzZXIgPSBhc3luYyAoXG4gICAgYnl0ZXMsXG4gICAgc3BlY2lmaWVyLFxuICAgIGxvY2F0aW9uLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBvcHRpb25zLFxuICApID0+IHtcbiAgICByZXR1cm4gYXN5bmNUcmFtcG9saW5lKFxuICAgICAgZ2V0UGFyc2VyR2VuZXJhdG9yLFxuICAgICAgYnl0ZXMsXG4gICAgICBzcGVjaWZpZXIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfTtcblxuICAvL1xuICAvL1xuICAvL1xuICBpZiAocHJlZmVyU3luY2hyb25vdXMpIHtcbiAgICB0cmFuc2Zvcm1zID0gc3luY01vZHVsZVRyYW5zZm9ybXM7XG4gICAgcmV0dXJuIHN5bmNQYXJzZXI7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSB7XG4gICAgICAuLi5zeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIC4uLm1vZHVsZVRyYW5zZm9ybXMsXG4gICAgfTtcblxuICAgIHJldHVybiBhc3luY1BhcnNlcjtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIG1hcFBhcnNlcnMoXG4gIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIG1vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgcHJlZmVyU3luY2hyb25vdXMgPSBmYWxzZSxcbikge1xuICBjb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMgPSBbXTtcbiAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgZm9yIChjb25zdCBbZXh0ZW5zaW9uLCBsYW5ndWFnZV0gb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpIHtcbiAgICBpZiAoaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sIGxhbmd1YWdlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2JsZW1zLnB1c2goYCR7cShsYW5ndWFnZSl9IGZvciBleHRlbnNpb24gJHtxKGV4dGVuc2lvbil9YCk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgRXJyb3IoYE5vIHBhcnNlciBhdmFpbGFibGUgZm9yIGxhbmd1YWdlOiAke3Byb2JsZW1zLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgcmV0dXJuIG1ha2VFeHRlbnNpb25QYXJzZXIoXG4gICAgcHJlZmVyU3luY2hyb25vdXMsXG4gICAgZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbiAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICBtb2R1bGVUcmFuc2Zvcm1zLFxuICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICApO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcFBhcnNlcnMgPSAoe1xuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG59KSA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGFzeW5jUGFyc2VGbiA9IChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICApO1xuXG4gIGlmIChtb2R1bGVUcmFuc2Zvcm1zICYmIGtleXMobW9kdWxlVHJhbnNmb3JtcykubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBhc3luY1BhcnNlRm47XG4gIH1cblxuICAvL1xuICAvL1xuICBpZiAodmFsdWVzKHBhcnNlckZvckxhbmd1YWdlKS5zb21lKCh7IHN5bmNocm9ub3VzIH0pID0+ICFzeW5jaHJvbm91cykpIHtcbiAgICByZXR1cm4gYXN5bmNQYXJzZUZuO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgcmV0dXJuIChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHRydWUsXG4gICAgKTtcbn07JGjNj19vbmNlLm1ha2VNYXBQYXJzZXJzKG1ha2VNYXBQYXJzZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBQYXJzZXJzIjpbIm1ha2VNYXBQYXJzZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJscmtbPCwAAzwsAADwAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImpvaW4iLCJyZWxhdGl2aXplIiwicmVzb2x2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuICovXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzb2x2ZSA9IChzb2x1dGlvbiwgcHJvYmxlbSkgPT4ge1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSkge1xuICAgIGlmIChwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJycpIHtcbiAgICAgIC8vXG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBpZiAoc29sdXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNvbHV0aW9uLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb2x1dGlvbi5wdXNoKHBhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc29sdmUgPSAoc3BlYywgcmVmZXJyZXIpID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcbiAgcmVmZXJyZXIgPSBTdHJpbmcocmVmZXJyZXIgfHwgJycpO1xuXG4gIGlmIChzcGVjLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuICB9XG4gIGlmICghcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuICB9XG5cbiAgY29uc3Qgc3BlY1BhcnRzID0gc3BlYy5zcGxpdCgnLycpO1xuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBjb25zdCBwcm9ibGVtID0gW107XG4gIGlmIChzcGVjUGFydHNbMF0gPT09ICcuJyB8fCBzcGVjUGFydHNbMF0gPT09ICcuLicpIHtcbiAgICBjb25zdCByZWZlcnJlclBhcnRzID0gcmVmZXJyZXIuc3BsaXQoJy8nKTtcbiAgICBwcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG4gICAgcHJvYmxlbS5wb3AoKTtcbiAgICBzb2x1dGlvbi5wdXNoKCcuJyk7XG4gIH1cbiAgcHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgcHJvYmxlbSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbiAgICAgICAgcmVmZXJyZXIsXG4gICAgICApfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuICAgICAgIGNvbnN0IGpvaW4gPSAoYmFzZSwgc3BlYykgPT4ge1xuICBzcGVjID0gU3RyaW5nKHNwZWMgfHwgJycpO1xuICBiYXNlID0gU3RyaW5nKGJhc2UgfHwgJycpO1xuXG4gIGNvbnN0IHNwZWNQYXJ0cyA9IHNwZWMuc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZVBhcnRzID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIGlmIChzcGVjUGFydHMubGVuZ3RoID4gMSAmJiBzcGVjUGFydHNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgRXJyb3IoYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gIH1cbiAgaWYgKGJhc2VQYXJ0c1swXSA9PT0gJy4nIHx8IGJhc2VQYXJ0c1swXSA9PT0gJy4uJykge1xuICAgIHRocm93IEVycm9yKGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuICB9XG4gIGlmIChzcGVjUGFydHNbMF0gIT09ICcuJykge1xuICAgIHRocm93IEVycm9yKGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuICB9XG5cbiAgY29uc3Qgc29sdXRpb24gPSBbXTtcbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgc3BlY1BhcnRzKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG4gICAgICAgIGJhc2UsXG4gICAgICApfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtiYXNlLCAuLi5zb2x1dGlvbl0uam9pbignLycpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5qb2luKGpvaW4pO1xuICAgICAgIGNvbnN0IHJlbGF0aXZpemUgPSBzcGVjID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcblxuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBpZiAoIXNvbHZlKHNvbHV0aW9uLCBzcGVjLnNwbGl0KCcvJykpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFsnLicsIC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG59OyRozY9fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VCeXRlcyA9IChieXRlcywgX3NwZWNpZmllciwgX2xvY2F0aW9uLCBfcGFja2FnZUxvY2F0aW9uKSA9PiB7XG4gIC8vXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICBjb25zdCBieXRlc1ZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBidWZmZXI7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZXI6ICdieXRlcycsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlQnl0ZXMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VCeXRlcyI6WyJwYXJzZUJ5dGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHU1Ym6pEwAAqRMAAEYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMsaXNSZWFkTm93UG93ZXJzOyRozY9faW1wb3J0cyhbW1wiLi9wb3dlcnMuanNcIiwgW1tcImZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzXCIsWyRozY9fYSA9PiAoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSAkaM2PX2EpXV0sW1wiaXNSZWFkTm93UG93ZXJzXCIsWyRozY9fYSA9PiAoaXNSZWFkTm93UG93ZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyZWV6ZSwga2V5cywgY3JlYXRlLCBoYXNPd25Qcm9wZXJ0eSwgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cbiAqL1xuY29uc3Qgbm9UcmFpbGluZ1NsYXNoID0gcGF0aCA9PiB7XG4gIGNvbnN0IGwgPSBwYXRoLmxlbmd0aCAtIDE7XG4gIHJldHVybiBwYXRoW2xdID09PSAnXFxcXCcgfHwgcGF0aFtsXSA9PT0gJy8nID8gcGF0aC5zbGljZSgwLCAtMSkgOiBwYXRoO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TW9kdWxlUGF0aHMgPSAocmVhZFBvd2VycywgbG9jYXRpb24pID0+IHtcbiAgaWYgKFxuICAgIHJlYWRQb3dlcnMgJiZcbiAgICB0eXBlb2YgcmVhZFBvd2VycyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aFxuICApIHtcbiAgICBsZXQgZmlsZW5hbWUgPSBsb2NhdGlvbjtcbiAgICBsZXQgZGlybmFtZTtcbiAgICB0cnkge1xuICAgICAgZGlybmFtZSA9IG5ldyBVUkwoJy4vJywgZmlsZW5hbWUpLmhyZWY7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6IG51bGwsXG4gICAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZpbGVuYW1lID0gcmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuICAgIGRpcm5hbWUgPSBub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgZGlybmFtZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogbnVsbCxcbiAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgfTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG4gICAgICAgY29uc3Qgd3JhcCA9ICh7XG4gIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuICBjb21wYXJ0bWVudCxcbiAgcmVzb2x2ZWRJbXBvcnRzLFxuICBsb2NhdGlvbixcbiAgcmVhZFBvd2Vycyxcbn0pID0+IHtcbiAgLy9cbiAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCA9IGNyZWF0ZShcbiAgICBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUsXG4gICk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHJvbW90ZVRvTmFtZWRFeHBvcnQgPSAocHJvcCwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIGlmIChwcm9wICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlZGVmaW5lZCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBvcmlnaW5hbEV4cG9ydHMgPSBuZXcgUHJveHkobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCwge1xuICAgIHNldChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgdmFsdWUpO1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgIGlmIChoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJykpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJlZGVmaW5lZC5hZGQocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHM6IG9yaWdpbmFsRXhwb3J0cyB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlcXVpcmUgPSBpbXBvcnRTcGVjaWZpZXIgPT4ge1xuICAgIC8vXG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgbmFtZXNwYWNlO1xuXG4gICAgaWYgKCFoYXMocmVzb2x2ZWRJbXBvcnRzLCBpbXBvcnRTcGVjaWZpZXIpKSB7XG4gICAgICBpZiAoaXNSZWFkTm93UG93ZXJzKHJlYWRQb3dlcnMpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IGNvbXBhcnRtZW50LmltcG9ydE5vdyhpbXBvcnRTcGVjaWZpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BzID0gZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMocmVhZFBvd2Vycykuc29ydCgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN5bmNocm9ub3VzIHJlYWRQb3dlcnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgaW1wb3J0IG9mICR7YXNzZXJ0LnF1b3RlKGltcG9ydFNwZWNpZmllcil9OyBtaXNzaW5nIG9yIGludmFsaWQgcHJvcChzKTogJHtpbnZhbGlkUHJvcHMuam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lc3BhY2UgPSBjb21wYXJ0bWVudC5pbXBvcnROb3cocmVzb2x2ZWRJbXBvcnRzW2ltcG9ydFNwZWNpZmllcl0pO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoaGFzKG5hbWVzcGFjZSwgJ2RlZmF1bHQnKSkge1xuICAgICAgcmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlO1xuICAgIH1cbiAgfTtcbiAgaWYgKHR5cGVvZiByZWFkUG93ZXJzID09PSAnb2JqZWN0JyAmJiByZWFkUG93ZXJzLnJlcXVpcmVSZXNvbHZlKSB7XG4gICAgY29uc3QgeyByZXF1aXJlUmVzb2x2ZSB9ID0gcmVhZFBvd2VycztcbiAgICByZXF1aXJlLnJlc29sdmUgPSBmcmVlemUoKHNwZWNpZmllciwgb3B0aW9ucykgPT5cbiAgICAgIHJlcXVpcmVSZXNvbHZlKGxvY2F0aW9uLCBzcGVjaWZpZXIsIG9wdGlvbnMpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmVxdWlyZS5yZXNvbHZlID0gZnJlZXplKHNwZWNpZmllciA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCxcbiAgICAgICk7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvZGUnLCB7IHZhbHVlOiAnTU9EVUxFX05PVF9GT1VORCcgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfVxuXG4gIGZyZWV6ZShyZXF1aXJlKTtcblxuICBjb25zdCBhZnRlckV4ZWN1dGUgPSAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxFeHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7IC8vXG4gICAgY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4gPSBmaW5hbEV4cG9ydHMgIT09IG9yaWdpbmFsRXhwb3J0cztcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4pIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQgPSBmaW5hbEV4cG9ydHM7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0IHx8IHt9KSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiByZWRlZmluZWQpIHtcbiAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG1vZHVsZSxcbiAgICBtb2R1bGVFeHBvcnRzOiBvcmlnaW5hbEV4cG9ydHMsXG4gICAgYWZ0ZXJFeGVjdXRlLFxuICAgIHJlcXVpcmUsXG4gIH07XG59OyRozY9fb25jZS53cmFwKHdyYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH6/VuZEBQAARAUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUxvY2F0ZWRKc29uOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VKc29uID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBsb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICBjb25zdCBzb3VyY2UgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSwgbG9jYXRpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ2pzb24nLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VKc29uLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlSnNvbiI6WyJwYXJzZUpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk1bSVB4IAAAeCAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIiwiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlQ2pzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcFwiLFskaM2PX2EgPT4gKHdyYXAgPSAkaM2PX2EpXV0sW1wiZ2V0TW9kdWxlUGF0aHNcIixbJGjNj19hID0+IChnZXRNb2R1bGVQYXRocyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVDanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyByZWFkUG93ZXJzIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgeyBzb3VyY2UsIGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cyB9ID0gcGFyc2VMb2NhdGVkSnNvbihcbiAgICB0ZXh0LFxuICAgIGxvY2F0aW9uLFxuICApO1xuXG4gIGNvbnN0IHsgZmlsZW5hbWUsIGRpcm5hbWUgfSA9IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsIGxvY2F0aW9uKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IChtb2R1bGVFbnZpcm9ubWVudFJlY29yZCwgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgIGNvbnN0IGZ1bmN0b3IgPSBjb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG4gICAgY29uc3QgeyByZXF1aXJlLCBtb2R1bGVFeHBvcnRzLCBtb2R1bGUsIGFmdGVyRXhlY3V0ZSB9ID0gd3JhcCh7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWFkUG93ZXJzLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBmdW5jdG9yLmNhbGwoXG4gICAgICBtb2R1bGVFeHBvcnRzLFxuICAgICAgcmVxdWlyZSxcbiAgICAgIG1vZHVsZUV4cG9ydHMsXG4gICAgICBtb2R1bGUsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGRpcm5hbWUsXG4gICAgKTtcblxuICAgIGFmdGVyRXhlY3V0ZSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLWNqcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQ6IHtcbiAgICAgIGltcG9ydHMsXG4gICAgICByZWV4cG9ydHMsXG4gICAgICBleHBvcnRzLFxuICAgICAgZXhlY3V0ZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlQ2pzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiB0cnVlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbjskaM2PX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVNanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyBzb3VyY2VNYXBVcmwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBjb25zdCByZWNvcmQgPSBwYXJzZUxvY2F0ZWRKc29uKHRleHQsIGxvY2F0aW9uKTtcbiAgaWYgKHNvdXJjZU1hcFVybCkge1xuICAgIC8vXG4gICAgcmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXyArPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18gKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLW1qcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQsXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZVByZU1qcyhwYXJzZVByZU1qcyk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VQcmVNanMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVNanMiOlsicGFyc2VQcmVNanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdmA97PoEAAD6BAAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXRleHQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVRleHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VUZXh0ID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBfbG9jYXRpb24sIF9wYWNrYWdlTG9jYXRpb24pID0+IHtcbiAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbXBvcnRzID0gZnJlZXplKFtdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gZXhwb3J0cyA9PiB7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gdGV4dDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ3RleHQnLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VUZXh0KHBhcnNlVGV4dCk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VUZXh0LFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABuT8atUYAADVGAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWSA9ICdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZID0gJ3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUgPSAnYW55JztcbmNvbnN0IFBPTElDWV9GSUVMRFNfTE9PS1VQID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ2J1aWx0aW5zJyxcbiAgJ2dsb2JhbHMnLFxuICAncGFja2FnZXMnLFxuXSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcG9saWN5TG9va3VwSGVscGVyID0gKHBhY2thZ2VQb2xpY3ksIGZpZWxkLCBpdGVtTmFtZSkgPT4ge1xuICBpZiAoIVBPTElDWV9GSUVMRFNfTE9PS1VQLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGZpZWxkICR7cShmaWVsZCl9YCk7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBwYWNrYWdlUG9saWN5ICE9PSAnb2JqZWN0JyB8fFxuICAgIHBhY2thZ2VQb2xpY3kgPT09IG51bGwgfHxcbiAgICAhcGFja2FnZVBvbGljeVtmaWVsZF1cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VQb2xpY3lbZmllbGRdID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBwYWNrYWdlUG9saWN5W2ZpZWxkXVxuICApO1xuICBpZiAoaXRlbU5hbWUgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVbaXRlbU5hbWVdO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbiAgICAgICBjb25zdCBpc0FsbG93aW5nRXZlcnl0aGluZyA9IHBvbGljeVZhbHVlID0+XG4gIHBvbGljeVZhbHVlID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuaXNBbGxvd2luZ0V2ZXJ5dGhpbmcoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcpO1xuICAgICAgIGNvbnN0IGlzQXR0ZW51YXRpb25EZWZpbml0aW9uID0gYWxsZWdlZERlZmluaXRpb24gPT4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICAoYWxsZWdlZERlZmluaXRpb24gJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0gPT09ICdzdHJpbmcnKSB8fCAvL1xuICAgICAgaXNBcnJheShhbGxlZ2VkRGVmaW5pdGlvbikgIC8vXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbiAgICAgICBjb25zdCBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSBhdHRlbnVhdGlvbkRlZmluaXRpb24gPT4ge1xuICBpZiAoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGF0dGVudWF0aW9uICR7cShcbiAgICAgICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgICAgKX0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgLFxuICAgICk7XG4gIH1cbiAgaWYgKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5TmFtZTogJzxkZWZhdWx0IGF0dGVudWF0b3I+JyxcbiAgICAgIHNwZWNpZmllcjogbnVsbCxcbiAgICAgIHBhcmFtczogYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgc3BlY2lmaWVyOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgcGFyYW1zOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9QQVJBTVNfS0VZXSxcbiAgICB9O1xuICB9XG59O1xuXG4vL1xuJGjNj19vbmNlLmdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24pO2NvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuICBpZiAodHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IGl0ZW0gPT09IG51bGwgfHwgaXNBcnJheShpdGVtKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZW50cmllcyhpdGVtKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PiBwcmVkaWNhdGUodmFsdWUsIGtleSkpO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNCb29sZWFuID0gaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ2Jvb2xlYW4nO1xuXG4vL1xuY29uc3QgcHJlZGljYXRlT3IgPVxuICAoLi4ucHJlZGljYXRlcykgPT5cbiAgaXRlbSA9PlxuICAgIHByZWRpY2F0ZXMuc29tZShwID0+IHAoaXRlbSkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNQb2xpY3lJdGVtID0gaXRlbSA9PlxuICBpdGVtID09PSB1bmRlZmluZWQgfHxcbiAgaXRlbSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFIHx8XG4gIGlzUmVjb3JkT2YoaXRlbSwgaXNCb29sZWFuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYWNrYWdlUG9saWN5ID0gKGFsbGVnZWRQYWNrYWdlUG9saWN5LCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaW5VcmwgPSB1cmwgPyBgIGluICR7cSh1cmwpfWAgOiAnJztcblxuICBjb25zdCBwYWNrYWdlUG9saWN5ID0gT2JqZWN0KGFsbGVnZWRQYWNrYWdlUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSBwYWNrYWdlUG9saWN5ICYmICFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gLFxuICApO1xuICBjb25zdCB7XG4gICAgcGFja2FnZXMsXG4gICAgYnVpbHRpbnMsXG4gICAgZ2xvYmFscyxcbiAgICBub0dsb2JhbEZyZWV6ZSxcbiAgICBkZWZhdWx0QXR0ZW51YXRvcjogX2lnbm9yZSwgLy9cbiAgICAvL1xuICAgIG9wdGlvbnMsIC8vXG4gICAgLi4uZXh0cmFcbiAgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChwYWNrYWdlUG9saWN5KTtcblxuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9JHtpblVybH1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICBub0dsb2JhbEZyZWV6ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBub0dsb2JhbEZyZWV6ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGAke3BhdGh9Lm5vR2xvYmFsRnJlZXplIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHtxKHtcbiAgICAgIG5vR2xvYmFsRnJlZXplLFxuICAgIH0pfSR7aW5Vcmx9YCxcbiAgKTtcblxuICBpc1BvbGljeUl0ZW0ocGFja2FnZXMpIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbiAgICAgICAgcGFja2FnZXMsXG4gICAgICB9KX0ke2luVXJsfWAsXG4gICAgKTtcblxuICBpc1BvbGljeUl0ZW0oZ2xvYmFscykgfHxcbiAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihnbG9iYWxzKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxuICAgICAgICB7XG4gICAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgfSxcbiAgICAgICl9JHtpblVybH1gLFxuICAgICk7XG5cbiAgaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKSB8fFxuICAgIGlzUmVjb3JkT2YoYnVpbHRpbnMsIHByZWRpY2F0ZU9yKGlzQm9vbGVhbiwgaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuICAgICAgICBidWlsdGlucyxcbiAgICAgIH0pfSR7aW5Vcmx9YCxcbiAgICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRQYWNrYWdlUG9saWN5KGFzc2VydFBhY2thZ2VQb2xpY3kpO1xuICAgICAgIGNvbnN0IGFzc2VydFBvbGljeSA9IGFsbGVnZWRQb2xpY3kgPT4ge1xuICBpZiAoYWxsZWdlZFBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBvbGljeSA9IE9iamVjdChhbGxlZ2VkUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQb2xpY3kgPT09IHBvbGljeSAmJiAhQXJyYXkuaXNBcnJheShwb2xpY3kpLFxuICAgIGBwb2xpY3kgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQb2xpY3l9YCxcbiAgKTtcblxuICBjb25zdCB7IHJlc291cmNlcywgZW50cnksIGRlZmF1bHRBdHRlbnVhdG9yLCAuLi5leHRyYSB9ID0gcG9saWN5O1xuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGBwb2xpY3kgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICB0eXBlb2YgcmVzb3VyY2VzID09PSAnb2JqZWN0JyAmJiByZXNvdXJjZXMgIT09IG51bGwgJiYgIWlzQXJyYXkocmVzb3VyY2VzKSxcbiAgICBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWAsXG4gICk7XG4gIGFzc2VydChcbiAgICAhZGVmYXVsdEF0dGVudWF0b3IgfHwgdHlwZW9mIGRlZmF1bHRBdHRlbnVhdG9yID09PSAnc3RyaW5nJyxcbiAgICBgcG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZGVmYXVsdEF0dGVudWF0b3IpfWAsXG4gICk7XG5cbiAgYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgIGFzc2VydFBhY2thZ2VQb2xpY3kodmFsdWUsIGBwb2xpY3kucmVzb3VyY2VzW1wiJHtrZXl9XCJdYCk7XG4gIH1cbn07JGjNj19vbmNlLmFzc2VydFBvbGljeShhc3NlcnRQb2xpY3kpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPE/zSY+KgAAPioAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLFskaM2PX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRozY9fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLFskaM2PX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjNj19hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsWyRozY9fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaM2PX2EpXV0sW1wicG9saWN5TG9va3VwSGVscGVyXCIsWyRozY9fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGNyZWF0ZSwgZW50cmllcywgdmFsdWVzLCBhc3NpZ24sIGZyZWV6ZSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID1cbiAgT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICc8QVRURU5VQVRPUlM+JztcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpO1xuY29uc3Qgc2VsZWN0aXZlQ29weSA9IChmcm9tLCB0bywgbGlzdCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcHJvcHM7XG4gIGlmICghbGlzdCkge1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhmcm9tKTtcbiAgICBwcm9wcyA9IG93bktleXMoZnJvbSkuZmlsdGVyKGtleSA9PiBkZXNjc1trZXldLmVudW1lcmFibGUpO1xuICB9IGVsc2Uge1xuICAgIHByb3BzID0gbGlzdDtcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJvcHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3Qga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgIC8vXG4gICAgLy9cbiAgICB0b1trZXldID0gZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0bztcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnMgPSAoYXR0ZW51YXRvcnMsIHBvbGljeUZyYWdtZW50KSA9PiB7XG4gIGlmICgnYXR0ZW51YXRlJyBpbiBwb2xpY3lGcmFnbWVudCkge1xuICAgIGF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiAgfVxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyhwb2xpY3lGcmFnbWVudCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXRlY3RBdHRlbnVhdG9ycyA9IHBvbGljeSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmICghYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSkge1xuICAgIGNvbnN0IGF0dGVudWF0b3JzID0gW107XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcikge1xuICAgICAgYXR0ZW51YXRvcnMucHVzaChwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IpO1xuICAgIH1cbiAgICBjb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMsIHBvbGljeSk7XG4gICAgYXR0ZW51YXRvcnNDYWNoZS5zZXQocG9saWN5LCBhdHRlbnVhdG9ycyk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0b3JzQ2FjaGUuZ2V0KHBvbGljeSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lID0gKHsgaXNFbnRyeSA9IGZhbHNlLCBuYW1lLCBwYXRoIH0pID0+IHtcbiAgaWYgKGlzRW50cnkpIHtcbiAgICB0aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gIH1cbiAgaWYgKG5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oJz4nKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5ID0gKG5hbWluZ0tpdCwgcGFja2FnZVBvbGljeSkgPT4ge1xuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICAvL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjYW5vbmljYWxOYW1lID0gZ2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG4gIHJldHVybiAhIXBvbGljeUxvb2t1cEhlbHBlcihwYWNrYWdlUG9saWN5LCAncGFja2FnZXMnLCBjYW5vbmljYWxOYW1lKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcbiAgICAgICBjb25zdCBnZXRQb2xpY3lGb3JQYWNrYWdlID0gKG5hbWluZ0tpdCwgcG9saWN5KSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICByZXR1cm4gcG9saWN5LmVudHJ5O1xuICB9XG4gIGNvbnN0IGNhbm9uaWNhbE5hbWUgPSBnZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbiAgaWYgKGNhbm9uaWNhbE5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlZmF1bHRBdHRlbnVhdG9yOiBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsXG4gICAgICBwYWNrYWdlczogJ2FueScsXG4gICAgfTtcbiAgfVxuICBpZiAocG9saWN5LnJlc291cmNlcyAmJiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJldHVybiBjcmVhdGUobnVsbCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcbmNvbnN0IGdldEdsb2JhbHNMaXN0ID0gcGFja2FnZVBvbGljeSA9PiB7XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCAhcGFja2FnZVBvbGljeS5nbG9iYWxzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscylcbiAgICAuZmlsdGVyKChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAubWFwKChba2V5LCBfdnZhbHVlXSkgPT4ga2V5KTtcbn07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SID0gJ2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1IgPSAnYXR0ZW51YXRlTW9kdWxlJztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uID0gYXN5bmMgKFxuICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gIGF0dGVudWF0b3JzUHJvdmlkZXIsXG4gIGF0dGVudWF0b3JFeHBvcnROYW1lLFxuKSA9PiB7XG4gIGlmICghYXR0ZW51YXRvcnNQcm92aWRlcikge1xuICAgIHRocm93IEVycm9yKGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuICB9XG4gIGNvbnN0IHsgc3BlY2lmaWVyLCBwYXJhbXMsIGRpc3BsYXlOYW1lIH0gPSBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICApO1xuICBjb25zdCBhdHRlbnVhdG9yID0gYXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbiAgaWYgKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEF0dGVudWF0b3IgJHtxKGRpc3BsYXlOYW1lKX0gZG9lcyBub3QgZXhwb3J0ICR7cShhdHRlbnVhdG9yRXhwb3J0TmFtZSl9YCxcbiAgICApO1xuICB9XG4gIC8vXG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvciwgcGFyYW1zKTtcbiAgcmV0dXJuIGF0dGVudWF0ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAoXG4gIGNvbXBhcnRtZW50cyxcbiAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbXBvcnRBdHRlbnVhdG9yO1xuICBsZXQgZGVmYXVsdEF0dGVudWF0b3I7XG4gIC8vXG4gIC8vXG4gIGlmICghY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0pIHtcbiAgICBpbXBvcnRBdHRlbnVhdG9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoYE5vIGF0dGVudWF0b3JzIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlZmF1bHRBdHRlbnVhdG9yID1cbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGltcG9ydEF0dGVudWF0b3IgPSBhc3luYyBhdHRlbnVhdG9yU3BlY2lmaWVyID0+IHtcbiAgICAgIGlmICghYXR0ZW51YXRvclNwZWNpZmllcikge1xuICAgICAgICBpZiAoIWRlZmF1bHRBdHRlbnVhdG9yKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW51YXRvclNwZWNpZmllciA9IGRlZmF1bHRBdHRlbnVhdG9yO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi8gKGF0dGVudWF0b3JTcGVjaWZpZXIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuYW1lc3BhY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW1wb3J0OiBpbXBvcnRBdHRlbnVhdG9yLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbiAgYXR0ZW51YXRvcnMsXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgZ2xvYmFsVGhpcyxcbiAgZ2xvYmFscyxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIEdMT0JBTF9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cbiAgLy9cbiAgLy9cblxuICAvL1xuXG4gIGNvbnN0IHJlc3VsdCA9IC8qICAgICAgICovIGF0dGVudWF0ZShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIGFzc2lnbihnbG9iYWxUaGlzLCByZXN1bHQpO1xuICB9XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVHbG9iYWxzID0gKFxuICBnbG9iYWxUaGlzLFxuICBnbG9iYWxzLFxuICBwYWNrYWdlUG9saWN5LFxuICBhdHRlbnVhdG9ycyxcbiAgcGVuZGluZ0pvYnMsXG4gIG5hbWUgPSAnPHVua25vd24+JyxcbikgPT4ge1xuICBsZXQgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0ID0gKCkgPT4ge1xuICAgIGZyZWV6ZShnbG9iYWxUaGlzKTtcbiAgfTtcbiAgaWYgKHBhY2thZ2VQb2xpY3kgJiYgcGFja2FnZVBvbGljeS5ub0dsb2JhbEZyZWV6ZSkge1xuICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCA9ICgpID0+IHt9O1xuICB9XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCBpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKSB7XG4gICAgc2VsZWN0aXZlQ29weShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpIHtcbiAgICBjb25zdCBhdHRlbnVhdGlvbkRlZmluaXRpb24gPSBwYWNrYWdlUG9saWN5Lmdsb2JhbHM7XG4gICAgY29uc3QgeyBkaXNwbGF5TmFtZSB9ID0gZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG4gICAgY29uc3QgYXR0ZW51YXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkgLy9cbiAgICAgIC50aGVuKCgpID0+XG4gICAgICAgIGF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnRoZW4oZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0LCBlcnJvciA9PiB7XG4gICAgICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3Igd2hpbGUgYXR0ZW51YXRpbmcgZ2xvYmFscyBmb3IgJHtxKG5hbWUpfSB3aXRoICR7cShcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgICAgICl9OiAke3EoZXJyb3IubWVzc2FnZSl9YCAgLy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHBlbmRpbmdKb2JzLnB1c2goYXR0ZW51YXRpb25Qcm9taXNlKTtcblxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsaXN0ID0gZ2V0R2xvYmFsc0xpc3QocGFja2FnZVBvbGljeSk7XG4gIHNlbGVjdGl2ZUNvcHkoZ2xvYmFscywgZ2xvYmFsVGhpcywgbGlzdCk7XG4gIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuYXR0ZW51YXRlR2xvYmFscyhhdHRlbnVhdGVHbG9iYWxzKTtcbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5ID0gZXJyb3JIaW50ID0+IHtcbiAgaWYgKCFlcnJvckhpbnQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIGAgKGluZm86ICR7ZXJyb3JIaW50fSlgO1xufTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZW5mb3JjZU1vZHVsZVBvbGljeSA9IChcbiAgc3BlY2lmaWVyLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gIHsgZXhpdCwgZXJyb3JIaW50IH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHBvbGljeSwgbW9kdWxlcywgbGFiZWwgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgaWYgKCFwb2xpY3kpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWV4aXQpIHtcbiAgICBpZiAoIW1vZHVsZXNbc3BlY2lmaWVyXSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG4gICAgICAgICAgcG9saWN5LnBhY2thZ2VzLFxuICAgICAgICApfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCAnYnVpbHRpbnMnLCBzcGVjaWZpZXIpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmVuZm9yY2VNb2R1bGVQb2xpY3koZW5mb3JjZU1vZHVsZVBvbGljeSk7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVNb2R1bGUoe1xuICBhdHRlbnVhdG9ycyxcbiAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIE1PRFVMRV9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgaW1wb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuaW1wb3J0cyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXhwb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhwb3J0cyxcbiAgICBleGVjdXRlOiAobW9kdWxlRXhwb3J0cywgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgICAgY29uc3QgbnMgPSB7fTtcbiAgICAgIG9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsIGNvbXBhcnRtZW50LCByZXNvbHZlZEltcG9ydHMpO1xuICAgICAgY29uc3QgYXR0ZW51YXRlZCA9IGF0dGVudWF0ZShucyk7XG4gICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQgPSBhdHRlbnVhdGVkO1xuICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIGF0dGVudWF0ZWQpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVNb2R1bGVIb29rID0gYXN5bmMgKFxuICBzcGVjaWZpZXIsXG4gIG9yaWdpbmFsTW9kdWxlUmVjb3JkLFxuICBwb2xpY3ksXG4gIGF0dGVudWF0b3JzLFxuKSA9PiB7XG4gIGNvbnN0IHBvbGljeVZhbHVlID0gcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwgJ2J1aWx0aW5zJywgc3BlY2lmaWVyKTtcbiAgaWYgKCFwb2xpY3kgfHwgcG9saWN5VmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxNb2R1bGVSZWNvcmQ7XG4gIH1cblxuICBpZiAoIXBvbGljeVZhbHVlKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0ZU1vZHVsZSh7XG4gICAgYXR0ZW51YXRvcnMsXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uOiBwb2xpY3lWYWx1ZSxcbiAgICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbiAgfSk7XG59OyRozY9fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAr2h7pdwIAADcCAAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiLCJpc1JlYWROb3dQb3dlcnMiLCJ1bnBhY2tSZWFkUG93ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW0gPSBhc3luYyBwYXRoID0+IHBhdGg7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgdW5wYWNrUmVhZFBvd2VycyA9IHBvd2VycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG1heWJlUmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGNhbm9uaWNhbDtcblxuICBpZiAodHlwZW9mIHBvd2VycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWQgPSBwb3dlcnM7XG4gIH0gZWxzZSB7XG4gICAgKHsgcmVhZCwgbWF5YmVSZWFkLCBjYW5vbmljYWwgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocG93ZXJzKSk7XG4gIH1cblxuICBpZiAoY2Fub25pY2FsID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5vbmljYWwgPSBjYW5vbmljYWxTaGltO1xuICB9XG5cbiAgaWYgKG1heWJlUmVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbWF5YmVSZWFkID0gcGF0aCA9PlxuICAgICAgLyogICAgICAgICAgICAgICAgICovIChyZWFkKShwYXRoKS5jYXRjaChfZXJyb3IgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucG93ZXJzLFxuICAgIHJlYWQsXG4gICAgbWF5YmVSZWFkLFxuICAgIGNhbm9uaWNhbCxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudW5wYWNrUmVhZFBvd2Vycyh1bnBhY2tSZWFkUG93ZXJzKTtcbmNvbnN0IHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzID0gZnJlZXplKFxuICAvKiAgICAgICAgICAgICAgICAqLyAoWydmaWxlVVJMVG9QYXRoJywgJ2lzQWJzb2x1dGUnLCAnbWF5YmVSZWFkTm93J10pLFxuKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNSZWFkTm93UG93ZXJzID0gdmFsdWUgPT5cbiAgQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMuZXZlcnkoXG4gICAgICAgIHByb3AgPT4gcHJvcCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbcHJvcF0gPT09ICdmdW5jdGlvbicsXG4gICAgICApLFxuICApO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaXNSZWFkTm93UG93ZXJzKGlzUmVhZE5vd1Bvd2Vycyk7XG4gICAgICAgY29uc3QgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSB2YWx1ZSA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFsuLi5yZXF1aXJlZFJlYWROb3dQb3dlcnNQcm9wc107XG4gIH1cbiAgcmV0dXJuIHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzLmZpbHRlcihcbiAgICBwcm9wID0+ICEocHJvcCBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3BdICE9PSAnZnVuY3Rpb24nLFxuICApO1xufTskaM2PX29uY2UuZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl0sImlzUmVhZE5vd1Bvd2VycyI6WyJpc1JlYWROb3dQb3dlcnMiXSwiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3R5cGVzLWV4dGVybmFsLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSioamiAQAAogEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAusIkdug8AALoPAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cblxuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8vXG4vL1xuY29uc3QgdW5jdXJyeVRoaXMgPVxuICBmbiA9PlxuICAocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG4gICAgYXBwbHkoZm4sIHJlY2VpdmVyLCBhcmdzKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXMgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsID0gKGxpdGVyYWxzLCAuLi5hcmdzKSA9PiB7XG4gIGxldCBtc2cgPSBsaXRlcmFsc1swXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbXNnID0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2kgKyAxXX1gO1xuICB9XG4gIHRocm93IEVycm9yKG1zZyk7XG59O1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVudmlyb25tZW50Q2FwdG9yID0gKGFHbG9iYWwsIGRyb3BOYW1lcyA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9IFtdO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAoXG4gICAgb3B0aW9uTmFtZSxcbiAgICBkZWZhdWx0U2V0dGluZyxcbiAgICBvcHRPdGhlclZhbHVlcyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgdHlwZW9mIG9wdGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgICAgKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHNldHRpbmcgPSBkZWZhdWx0U2V0dGluZztcbiAgICBjb25zdCBnbG9iYWxQcm9jZXNzID0gYUdsb2JhbC5wcm9jZXNzIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBnbG9iYWxFbnYgPVxuICAgICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8vXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICBvcHRpb25OYW1lLFxuICAgICAgICAgICl9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbiAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBzZXR0aW5nID09PSBkZWZhdWx0U2V0dGluZyB8fFxuICAgICAgYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcywgc2V0dGluZykgfHxcbiAgICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgKX0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLCAuLi5vcHRPdGhlclZhbHVlc10pfWA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEwL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmIChnbG9iYWxBc3NlcnQgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCxcbiAgKTtcbn1cblxuY29uc3QgbWlzc2luZyA9IC8qICAgICAgICAgICAgICAgICovIChbXG4gICd0eXBlb2YnLFxuICAnZXJyb3InLFxuICAnZmFpbCcsXG4gICdlcXVhbCcsXG4gICdzdHJpbmcnLFxuICAnbm90ZScsXG4gICdkZXRhaWxzJyxcbiAgJ0ZhaWwnLFxuICAncXVvdGUnLFxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAnbWFrZUFzc2VydCcsXG5dKS5maWx0ZXIobmFtZSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICcsXG4gICAgKX1gLFxuICApO1xufVxuXG4vL1xuLy9cbi8vXG5jb25zdCB7XG4gIGJhcmUsXG4gIGRldGFpbHM6IHJlZGFjdGVkLFxuICBlcnJvcjogbWFrZUVycm9yLFxuICBGYWlsOiB0aHJvd1JlZGFjdGVkLFxuICBtYWtlQXNzZXJ0OiBfb21pdHRlZE1ha2VBc3NlcnQsXG4gIG5vdGUsXG4gIHF1b3RlLFxuICAuLi5hc3NlcnRpb25zXG59ID0gZ2xvYmFsQXNzZXJ0O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtjb25zdCBhc3NlcnQ9KHZhbHVlLG9wdERldGFpbHMsZXJyQ29udHJ1Y3RvcixvcHRpb25zKT0+XG4gIGdsb2JhbEFzc2VydCh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsIGFzc2VydGlvbnMpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMmxgxkbFgAAGxYAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKlxuXG4gKi9cblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcyAhPT0gcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBtYWtlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBYYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICAgICl9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ0FycmF5KTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gSGFuZGxlZFByb21pc2UuZ2V0KHgsIHByb3ApLFxuICB9KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG9ialRhcmdldCA9IGZyZWV6ZSh7IF9fcHJvdG9fXzogbnVsbCB9KTtcblxuLypcblxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgeCA9PiBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcbiAgICAgIHtcbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIC8vXG4gICAgICAgIGdldDogeCA9PiBuZXcgUHJveHkob2JqVGFyZ2V0LCBtYWtlRUdldFByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgZ2V0UHJvdG90eXBlT2YsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZiA9IHNwZWNpbWVuID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiBPYmplY3QodmFsKSA9PT0gdmFsO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkID0gKGEsIGIpID0+IHtcbiAgaWYgKHR5cGVvZiBhID09PSB0eXBlb2YgYikge1xuICAgIGNvbnN0IGxlZnQgPSBTdHJpbmcoYSk7XG4gICAgY29uc3QgcmlnaHQgPSBTdHJpbmcoYik7XG4gICAgLy9cbiAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdzeW1ib2wnKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGFzc2VydCh0eXBlb2YgYSA9PT0gJ3N0cmluZycpO1xuICBhc3NlcnQodHlwZW9mIGIgPT09ICdzeW1ib2wnKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLy9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLy9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8vXG4vL1xuJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtmcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseUZ1bmN0aW9uID0gKHJlY2lwaWVudCwgYXJncykgPT4ge1xuICB0eXBlb2YgcmVjaXBpZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ3MpO1xuICB9XG4gIGlmIChyZWNpcGllbnQgPT09IHVuZGVmaW5lZCB8fCByZWNpcGllbnQgPT09IG51bGwpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZ0eXBlID0gbnR5cGVvZihmbik7XG4gIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG4gICAgICBmdHlwZSxcbiAgICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLy9cbiAgICBkZWJ1Z2dlcjsgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuICAgICAgIGNvbnN0IGxvY2FsR2V0ID0gKHQsIGtleSkgPT4gdFtrZXldOyRozY9fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB5M+y4PA8AADwPAAA1AAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGhhc093biwgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZCA9IHZhbCA9PlxuICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjbGFzc0JQc1t0YWddID0gY291bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrcG9pbnRzID0gbmV3QnJlYWtwb2ludHM7XG4gICAgYnJlYWtwb2ludHNUYWJsZSA9IG5ld0JyZWFrcG9pbnRzVGFibGU7XG4gIH07XG4gIGZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2hvdWxkQnJlYWtwb2ludCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUpID0+IHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpgMOzngoAAJ4KAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8vXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLy9cbi8vXG5jb25zdCBFTkFCTEVEID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pID09PSAnZW5hYmxlZCc7XG5cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjQuMC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCduYW1lJyx7dmFsdWU6XCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjNj19vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBjb21wYXJ0bWVudE9wdGlvbnMgPSAoLi4uYXJncykgPT4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKFxuICAgIGFyZ3MubGVuZ3RoID09PSAxICYmXG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmXG4gICAgYXJnc1swXSAhPT0gbnVsbCAmJlxuICAgICdfX29wdGlvbnNfXycgaW4gYXJnc1swXVxuICApIHtcbiAgICBjb25zdCB7IF9fb3B0aW9uc19fLCAuLi5vcHRpb25zIH0gPSBhcmdzWzBdO1xuICAgIGFzc2VydChcbiAgICAgIF9fb3B0aW9uc19fID09PSB0cnVlLFxuICAgICAgYENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG9ubHkgc3VwcG9ydHMgdHJ1ZSBfX29wdGlvbnNfXyBzaWdpbCwgZ290ICR7X19vcHRpb25zX199YCxcbiAgICApO1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtcbiAgICAgIGdsb2JhbHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh7fSksXG4gICAgICBtb2R1bGVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICAgIG9wdGlvbnMgPSB7fSxcbiAgICBdID0gYXJncztcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBvcHRpb25zLm1vZHVsZXMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgQ29tcGFydG1lbnQgY29uc3RydWN0b3IgbXVzdCByZWNlaXZlIGVpdGhlciBhIG1vZHVsZSBtYXAgYXJndW1lbnQgb3IgbW9kdWxlcyBvcHRpb24sIG5vdCBib3RoYCxcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG9wdGlvbnMuZ2xvYmFscyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBDb21wYXJ0bWVudCBjb25zdHJ1Y3RvciBtdXN0IHJlY2VpdmUgZWl0aGVyIGdsb2JhbHMgYXJndW1lbnQgb3Igb3B0aW9uLCBub3QgYm90aGAsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgIH07XG4gIH1cbn07XG5cbiAgICAgICBmdW5jdGlvbiB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbiAgT2xkQ29tcGFydG1lbnQsXG4gIGluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbiAgaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzLFxuKSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE5ld0NvbXBhcnRtZW50ID0gZnVuY3Rpb24gQ29tcGFydG1lbnQoLi4uYXJncykge1xuICAgIGNvbnN0IHsgdHJhbnNmb3Jtczogb2xkVHJhbnNmb3JtcyA9IFtdLCAuLi5vdGhlck9wdGlvbnMgfSA9XG4gICAgICBjb21wYXJ0bWVudE9wdGlvbnMoLi4uYXJncyk7XG4gICAgY29uc3QgbmV3VHJhbnNmb3JtcyA9IFsuLi5vbGRUcmFuc2Zvcm1zLCAuLi5pbmVzY2FwYWJsZVRyYW5zZm9ybXNdO1xuICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7XG4gICAgICAuLi5vdGhlck9wdGlvbnMsXG4gICAgICB0cmFuc2Zvcm1zOiBuZXdUcmFuc2Zvcm1zLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKG5ldy50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIHRocm93IEVycm9yKCdDb21wYXJ0bWVudCBtdXN0IGJlIGNhbGxlZCBhcyBhIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgLy9cblxuICAgIGNvbnN0IGMgPSBSZWZsZWN0LmNvbnN0cnVjdChPbGRDb21wYXJ0bWVudCwgW25ld09wdGlvbnNdLCBuZXcudGFyZ2V0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSBOZXdDb21wYXJ0bWVudDtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBSZWZsZWN0Lm93bktleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcywgcHJvcCwge1xuICAgICAgICB2YWx1ZTogaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgLy9cbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjO1xuICB9O1xuXG4gIC8vXG4gIE5ld0NvbXBhcnRtZW50LnByb3RvdHlwZSA9IE9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIHJldHVybiBOZXdDb21wYXJ0bWVudDtcbn1cblxuLy9cbi8vXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrtsVhihYAAIoWAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2Vycm9ycyIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIiwiaW1wb3J0QnVuZGxlIiwidHlwZWRJbXBvcnRCdW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUFyY2hpdmUsZGVjb2RlQmFzZTY0LEZhaWwsd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLFskaM2PX2EgPT4gKHBhcnNlQXJjaGl2ZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIixbJGjNj19hID0+ICh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydEJ1bmRsZSwnbmFtZScse3ZhbHVlOlwiaW1wb3J0QnVuZGxlXCJ9KTskaM2PX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLy9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBpbXBvcnRCdW5kbGUoYnVuZGxlLCBvcHRpb25zID0ge30sIHBvd2VycyA9IHt9KSB7XG4gIGF3YWl0IG51bGw7XG4gIGNvbnN0IHtcbiAgICBidW5kbGVVcmwgPSB1bmRlZmluZWQsXG4gICAgZmlsZVByZWZpeCxcbiAgICBlbmRvd21lbnRzOiBvcHRFbmRvd21lbnRzID0ge30sXG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMgPSB7fSxcbiAgICBleHBlY3RlZFNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtcbiAgICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gIH0gPSBwb3dlcnM7XG4gIGNvbnN0IGVuZG93bWVudHMgPSB7XG4gICAgVGV4dEVuY29kZXIsXG4gICAgVGV4dERlY29kZXIsXG4gICAgVVJMOiBnbG9iYWxUaGlzLlVSTCwgLy9cbiAgICBCYXNlNjQ6IGdsb2JhbFRoaXMuQmFzZTY0LCAvL1xuICAgIGF0b2I6IGdsb2JhbFRoaXMuYXRvYixcbiAgICBidG9hOiBnbG9iYWxUaGlzLmJ0b2EsXG4gICAgLi4ub3B0RW5kb3dtZW50cyxcbiAgfTtcblxuICBsZXQgQ29tcGFydG1lbnRUb1VzZSA9IENvbXBhcnRtZW50O1xuICBpZiAoXG4gICAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aCB8fFxuICAgIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykubGVuZ3RoXG4gICkge1xuICAgIC8vXG4gICAgQ29tcGFydG1lbnRUb1VzZSA9IHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuICAgICAgQ29tcGFydG1lbnQsXG4gICAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG4gICAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMsXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb21wYXJ0bWVudDtcblxuICBhc3NlcnQoJ21vZHVsZUZvcm1hdCcgaW4gYnVuZGxlKTtcbiAgY29uc3QgeyBtb2R1bGVGb3JtYXQgfSA9IGJ1bmRsZTtcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9aaXBCYXNlNjQnKSB7XG4gICAgYXNzZXJ0KCdlbmRvWmlwQmFzZTY0JyBpbiBidW5kbGUpO1xuICAgIGNvbnN0IHsgZW5kb1ppcEJhc2U2NCB9ID0gYnVuZGxlO1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0KGVuZG9aaXBCYXNlNjQpO1xuICAgIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBwYXJzZUFyY2hpdmUoYnl0ZXMsIGJ1bmRsZVVybCwge1xuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgIH0pO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gYXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuICAgICAgZ2xvYmFsczogZW5kb3dtZW50cyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXzogdHJhbnNmb3JtcyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFRvVXNlLFxuICAgIH0pO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICd0ZXN0Jykge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBidW5kbGVbU3ltYm9sLmZvcignZXhwb3J0cycpXTtcbiAgICBpZiAoZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgaW1wb3J0IGJ1bmRsZSB3aXRoIG1vZHVsZUZvcm1hdCBcInRlc3RcIiB0aGF0IGxhY2tzIGFuIHN5bWJvbC1uYW1lZCBwcm9wZXJ0eSBAZXhwb3J0cyBhbmQgaGFzIGxpa2VseSBiZWVuIHBhcnRpYWxseSB0cmFuc3BvcnRlZCB2aWEgSlNPTiBvciBldmVudHVhbC1zZW5kJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIE9iamVjdC5zZWFsKFxuICAgICAgT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFtcbiAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhleHBvcnRzKSlcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW25hbWUsIGRlc2NyaXB0b3JdKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IFtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleHBvcnRzW25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJyxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnQoJ3NvdXJjZScgaW4gYnVuZGxlKTtcbiAgbGV0IHsgc291cmNlIH0gPSBidW5kbGU7XG4gIGNvbnN0IHNvdXJjZU1hcCA9ICdzb3VyY2VNYXAnIGluIGJ1bmRsZSA/IGJ1bmRsZS5zb3VyY2VNYXAgOiAnJztcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2dldEV4cG9ydCcpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc291cmNlID0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB9YDtcbiAgfSBlbHNlIGlmIChtb2R1bGVGb3JtYXQgPT09ICduZXN0ZWRFdmFsdWF0ZScpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGVuZG93bWVudHMubmVzdGVkRXZhbHVhdGUgPSBzcmMgPT4gY29tcGFydG1lbnQuZXZhbHVhdGUoc3JjKTtcbiAgICBzb3VyY2UgPSBgKCR7c291cmNlfSlcXG4ke3NvdXJjZU1hcH1gO1xuICB9IGVsc2UgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9TY3JpcHQnKSB7XG4gICAgLy9cbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuICB9XG5cbiAgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLCB7fSwgeyB0cmFuc2Zvcm1zIH0pO1xuICBoYXJkZW4oY29tcGFydG1lbnQuZ2xvYmFsVGhpcyk7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvU2NyaXB0Jykge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgY29uc3QgbmFtZXNwYWNlID0gcmVzdWx0KGZpbGVQcmVmaXgpO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHlwZWRJbXBvcnRCdW5kbGUgPSBpbXBvcnRCdW5kbGU7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50eXBlZEltcG9ydEJ1bmRsZSh0eXBlZEltcG9ydEJ1bmRsZSk7XG4gICAgICAgY29uc3QgYnVuZGxlVGVzdEV4cG9ydHMgPSBleHBvcnRzID0+IHtcbiAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXhwb3J0cykuZmlsdGVyKFxuICAgIG5hbWUgPT4gbmFtZSAhPT0gU3ltYm9sLnRvU3RyaW5nVGFnLFxuICApO1xuICBzeW1ib2xzLmxlbmd0aCA+IDAgJiZcbiAgICBGYWlsYGV4cG9ydHMgbXVzdCBub3QgaGF2ZSBzeW1ib2wtbmFtZWQgcHJvcGVydGllcywgZ290OiAke3N5bWJvbHMubWFwKFN0cmluZykuam9pbignLCAnKX1gO1xuICByZXR1cm4ge1xuICAgIG1vZHVsZUZvcm1hdDogJ3Rlc3QnLFxuICAgIFtTeW1ib2wuZm9yKCdleHBvcnRzJyldOiBleHBvcnRzLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovJGjNj19vbmNlLmJ1bmRsZVRlc3RFeHBvcnRzKGJ1bmRsZVRlc3RFeHBvcnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImltcG9ydEJ1bmRsZSI6WyJpbXBvcnRCdW5kbGUiXSwidHlwZWRJbXBvcnRCdW5kbGUiOlsidHlwZWRJbXBvcnRCdW5kbGUiXSwiYnVuZGxlVGVzdEV4cG9ydHMiOlsiYnVuZGxlVGVzdEV4cG9ydHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALdVQBoIHAACCBwAAHQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJ0cml2aWFsQ29tcGFyYXRvciIsInRyaXZpYWxDb21wYXJhdG9yIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJV8ZZmaTwAAmk8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vL1xuY29uc3QgckMwID0gL1tcXHgwMC1cXHgxRl0vO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldFN1ZmZpeCA9IChzdHIsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKGluZGV4KSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZE5hbWVzID0gcmVjb3JkID0+XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGhhcmRlbigvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyZWNvcmQpKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcmVjb3JkVmFsdWVzID0gKHJlY29yZCwgbmFtZXMpID0+XG4gIGhhcmRlbihuYW1lcy5tYXAobmFtZSA9PiByZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzID0gQXJyYXkoMTYpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgaSkgPT4gJzAnLnJlcGVhdChpKSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB6ZXJvUGFkID0gKG4sIHNpemUpID0+IHtcbiAgY29uc3QgblN0ciA9IGAke259YDtcbiAgY29uc3QgZmlsbExlbiA9IHNpemUgLSBuU3RyLmxlbmd0aDtcbiAgaWYgKGZpbGxMZW4gPT09IDApIHJldHVybiBuU3RyO1xuICBhc3NlcnQoZmlsbExlbiA+IDAgJiYgZmlsbExlbiA8IHplcm9lcy5sZW5ndGgpO1xuICByZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xufTskaM2PX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBhc051bWJlciA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cyA9ICdmZmY4MDAwMDAwMDAwMDAwJztcblxuLypcblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0ID0gbiA9PiB7XG4gIC8vXG4gIGlmIChpcyhuLCAtMCkpIHtcbiAgICBuID0gMDtcbiAgfSBlbHNlIGlmIChpcyhuLCBOYU4pKSB7XG4gICAgcmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gIH1cbiAgYXNOdW1iZXJbMF0gPSBuO1xuICBsZXQgYml0cyA9IGFzQml0c1swXTtcbiAgaWYgKG4gPCAwKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICByZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksIDE2KX1gO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICdmJyB8fCBGYWlsYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IGJpdHMgPSBCaWdJbnQoYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpfWApO1xuICBpZiAoZW5jb2RlZC5jaGFyQXQoc2tpcCArIDEpIDwgJzgnKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICBhc0JpdHNbMF0gPSBiaXRzO1xuICBjb25zdCByZXN1bHQgPSBhc051bWJlclswXTtcbiAgIWlzKHJlc3VsdCwgLTApIHx8XG4gICAgRmFpbGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQgPSBuID0+IHtcbiAgY29uc3QgYWJzID0gbiA8IDBuID8gLW4gOiBuO1xuICBjb25zdCBuRGlnaXRzID0gYWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBjb25zdCBsRGlnaXRzID0gbkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbiAgaWYgKG4gPCAwbikge1xuICAgIHJldHVybiBgbiR7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvL1xuICAgICAgKDEwICoqIGxEaWdpdHMgLSBuRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsICcwJylcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgKyBuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsICcwJylcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHAke1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAnficucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLy9cbiAgICAgIG5EaWdpdHNcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgblxuICAgIH1gO1xuICB9XG59O1xuXG5jb25zdCByQmlnSW50UGF5bG9hZCA9IC8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qXG5cblxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQgPSBlbmNvZGVkID0+IHtcbiAgY29uc3QgdHlwZVByZWZpeCA9IGVuY29kZWQuY2hhckF0KDApOyAvL1xuICB0eXBlUHJlZml4ID09PSAncCcgfHxcbiAgICB0eXBlUHJlZml4ID09PSAnbicgfHxcbiAgICBGYWlsYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBjb25zdCB7XG4gICAgaW5kZXg6IGxEaWdpdHMsXG4gICAgMTogc25EaWdpdHMsXG4gICAgMjogdGFpbCxcbiAgICAzOiBkaWdpdHMsXG4gIH0gPSBlbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKSB8fCBGYWlsYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBzbkRpZ2l0cy5sZW5ndGggPT09IGxEaWdpdHMgfHxcbiAgICBGYWlsYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbkRpZ2l0cyA9IHBhcnNlSW50KHNuRGlnaXRzLCAxMCk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbkRpZ2l0cyA9IDEwICoqIC8qICAgICAgICAgICAgICAgICAqLyAobERpZ2l0cykgLSBuRGlnaXRzO1xuICB9XG5cbiAgdGFpbC5jaGFyQXQoMCkgPT09ICc6JyB8fCBGYWlsYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGRpZ2l0cy5sZW5ndGggPT09IG5EaWdpdHMgfHxcbiAgICBGYWlsYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuID0gQmlnSW50KGRpZ2l0cyk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbiA9IC0oMTBuICoqIEJpZ0ludChuRGlnaXRzKSAtIG4pO1xuICB9XG5cbiAgcmV0dXJuIG47XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGNwKSA9PiB7XG4gICAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICAgIHJldHVybiAnIV8nO1xuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiAnIXwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgICB9XG4gIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV0gPSAnX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV0gPSAnX18nO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gc3RyID0+XG4gIHN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywgY2ggPT4gc3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2ggPSAvKiAgICAgICAgICAgICAgICAgKi8gKHN1ZmZpeCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIChwcmVmaXggPT09ICchJyAmJiBzdWZmaXggIT09IHVuZGVmaW5lZCAmJiBjaCA+PSAnIScgJiYgY2ggPD0gJ0AnKSB8fFxuICAgICAgICAgIEZhaWxgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApIC0gMHgyMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IHN0ciA9PiBzdHI7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4gZW5jb2RlZDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydeJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGNoYXJzLnB1c2goZW5jLCAnICcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBsZXQgZGVwdGggPSAwO1xuICAvL1xuICAvL1xuICBsZXQgbmV4dEluZGV4ID0gc2tpcCArIDE7XG4gIGxldCBjdXJyZW50RWxlbWVudFN0YXJ0ID0gc2tpcCArIDE7XG4gIGZvciAoY29uc3QgeyAwOiBjaCwgaW5kZXg6IGkgfSBvZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpIHtcbiAgICBjb25zdCBpbmRleCA9IC8qICAgICAgICAgICAgICAgICAqLyAoaSk7XG4gICAgaWYgKGluZGV4IDw9IHNraXApIHtcbiAgICAgIGlmIChpbmRleCA9PT0gc2tpcCkge1xuICAgICAgICBjaCA9PT0gJ14nIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGlmIChpbmRleCA9PT0gbmV4dEluZGV4KSB7XG4gICAgICAgIC8vXG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGRlcHRoID49IDAgfHxcbiAgICAgICAgICAvL1xuICAgICAgICAgIEZhaWxgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLCBpbmRleCArIDIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICBkZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsIGluZGV4KSksXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8vXG4gICAgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICB9XG4gIGRlcHRoID09PSAwIHx8IEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBuZXh0SW5kZXggPT09IGVuY29kZWQubGVuZ3RoIHx8XG4gICAgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG4gICAgICBlbmNvZGVkLFxuICAgICAgY3VycmVudEVsZW1lbnRTdGFydCxcbiAgICApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydbJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgYyBvZiBlbmMpIHtcbiAgICAgIGlmIChjID09PSAnXFx1MDAwMCcgfHwgYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICAgIGNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiAgICAgIH1cbiAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeUFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBjb25zdCBlbGVtQ2hhcnMgPSBbXTtcbiAgLy9cbiAgLy9cbiAgbGV0IHN0aWxsVG9Ta2lwID0gc2tpcCArIDE7XG4gIGxldCBpbkVzY2FwZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGMgb2YgZW5jb2RlZCkge1xuICAgIGlmIChzdGlsbFRvU2tpcCA+IDApIHtcbiAgICAgIHN0aWxsVG9Ta2lwIC09IDE7XG4gICAgICBpZiAoc3RpbGxUb1NraXAgPT09IDApIHtcbiAgICAgICAgYyA9PT0gJ1snIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluRXNjYXBlKSB7XG4gICAgICBjID09PSAnXFx1MDAwMCcgfHxcbiAgICAgICAgYyA9PT0gJ1xcdTAwMDEnIHx8XG4gICAgICAgIEZhaWxgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb25zdCBlbmNvZGVkRWxlbWVudCA9IGVsZW1DaGFycy5qb2luKCcnKTtcbiAgICAgIGVsZW1DaGFycy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMScpIHtcbiAgICAgIGluRXNjYXBlID0gdHJ1ZTtcbiAgICAgIC8vXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGluRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgIWluRXNjYXBlIHx8IEZhaWxgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgZWxlbUNoYXJzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQgPSAocmVjb3JkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgbmFtZXMgPSByZWNvcmROYW1lcyhyZWNvcmQpO1xuICBjb25zdCB2YWx1ZXMgPSByZWNvcmRWYWx1ZXMocmVjb3JkLCBuYW1lcyk7XG4gIHJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcywgdmFsdWVzXSksIGVuY29kZVBhc3NhYmxlKX1gO1xufTtcblxuY29uc3QgZGVjb2RlUmVjb3JkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnKCcpO1xuICAvL1xuICAvL1xuICBjb25zdCB1bnppcHBlZEVudHJpZXMgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB1bnppcHBlZEVudHJpZXMubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBba2V5cywgdmFsc10gPSB1bnppcHBlZEVudHJpZXM7XG5cbiAgKHBhc3NTdHlsZU9mKGtleXMpID09PSAnY29weUFycmF5JyAmJlxuICAgIHBhc3NTdHlsZU9mKHZhbHMpID09PSAnY29weUFycmF5JyAmJlxuICAgIGtleXMubGVuZ3RoID09PSB2YWxzLmxlbmd0aCAmJlxuICAgIGtleXMuZXZlcnkoa2V5ID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSkgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgbWFwRW50cmllcyA9IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHNbaV1dKTtcbiAgY29uc3QgcmVjb3JkID0gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbiAgYXNzZXJ0UmVjb3JkKHJlY29yZCwgJ2RlY29kZWQgcmVjb3JkJyk7XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQgPSAodGFnZ2VkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+XG4gIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLCB0YWdnZWQucGF5bG9hZF0pLCBlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnOicpO1xuICAvL1xuICAvL1xuICBjb25zdCB0YWdnZWRQYXlsb2FkID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdGFnZ2VkUGF5bG9hZC5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFt0YWcsIHBheWxvYWRdID0gdGFnZ2VkUGF5bG9hZDtcbiAgcGFzc1N0eWxlT2YodGFnKSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgICBGYWlsYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1JlbW90YWJsZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVQcm9taXNlID0gKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSAocCwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVByb21pc2UocCwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJz8nKSB8fFxuICAgICAgRmFpbGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUHJvbWlzZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVByb21pc2U7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlRXJyb3IgPSAodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gKGVyciwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZUVycm9yKGVyciwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJyEnKSB8fFxuICAgICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gbWFrZUVuY29kZVJlbW90YWJsZShcbiAgICB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgdmVyaWZ5RW5jb2RpbmcsXG4gICk7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSBtYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZyk7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gbWFrZUVuY29kZUVycm9yKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZyk7XG5cbiAgY29uc3QgaW5uZXJFbmNvZGUgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOiB7XG4gICAgICAgIHJldHVybiAndic7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAneic7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHJldHVybiBgcyR7ZW5jb2RlU3RyaW5nU3VmZml4KHBhc3NhYmxlKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgcmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlbW90YWJsZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICByZXR1cm4gYHkke2VuY29kZVN0cmluZ1N1ZmZpeChuYW1lKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gIC8qICAgICAgICAgICAgICAgICAgKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBib29sZWFuOiAnYicsXG4gIG51bWJlcjogJ2YnLFxuICBiaWdpbnQ6ICducCcsXG4gIHJlbW90YWJsZTogJ3InLFxuICBzdHJpbmc6ICdzJyxcbiAgbnVsbDogJ3YnLFxuICBzeW1ib2w6ICd5JyxcbiAgLy9cbiAgLy9cbiAgLy9cbiAgdW5kZWZpbmVkOiAneicsXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IFFDTEFTUyA9ICdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLypcblxuXG4gKi9cbmNvbnN0IGhhc1FDbGFzcyA9IGVuY29kZWQgPT4gaGFzT3duUHJvcGVydHlPZihlbmNvZGVkLCBRQ0xBU1MpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzID0gKGVuY29kZWQsIHFjbGFzcykgPT5cbiAgaXNPYmplY3QoZW5jb2RlZCkgJiZcbiAgIWlzQXJyYXkoZW5jb2RlZCkgJiZcbiAgaGFzUUNsYXNzKGVuY29kZWQpICYmXG4gIGVuY29kZWRbUUNMQVNTXSA9PT0gcWNsYXNzO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IHJlbSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSBlcnIgPT4gRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9DYXBEYXRhID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICd1bmRlZmluZWQnIH07XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdJbmZpbml0eScgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICctSW5maW5pdHknIH07XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdiaWdpbnQnLFxuICAgICAgICAgIGRpZ2l0czogU3RyaW5nKHBhc3NhYmxlKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3N5bWJvbCcsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLCBRQ0xBU1MpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCB7IFtRQ0xBU1NdOiBxY2xhc3NWYWx1ZSwgLi4ucmVzdCB9ID0gcGFzc2FibGU7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ2hpbGJlcnQnLFxuICAgICAgICAgICAgb3JpZ2luYWw6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXN1bHQucmVzdCA9IGVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAndGFnZ2VkJyxcbiAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9DYXBEYXRhUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICApfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdzbG90JyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnZXJyb3InKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IHNsb3RFbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGVycm9yRW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gICAgRmFpbGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEsXG4gICAgKX0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZUZyb21DYXBEYXRhID0ganNvbkVuY29kZWQgPT4ge1xuICAgIGlmICghaXNPYmplY3QoanNvbkVuY29kZWQpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCAnb3JpZ2luYWwnKSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBbUUNMQVNTXTogZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpIH07XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsICdyZXN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTm9uRW1wdHlPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgcmVzdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgcmVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxO1xuICAgICAgICAgICAgaWYgKCFpc05vbkVtcHR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN0T2JqID0gZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAhaGFzT3duUHJvcGVydHlPZihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9hgbT0EsAABBLAAALQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgaXMsIGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEJBTkcgPSAnIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0ggPSAnLScuY2hhckNvZGVBdCgwKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbCA9IGVuY29kZWRTdHIgPT4ge1xuICBpZiAoZW5jb2RlZFN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9cbiAgY29uc3QgY29kZSA9IGVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbiAgLy9cbiAgcmV0dXJuIEJBTkcgPD0gY29kZSAmJiBjb2RlIDw9IERBU0g7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gcmVtID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBlcnIgPT5cbiAgRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yID0gZW5jb2RpbmcgPT4ge1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdvYmplY3QnICYmIGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8vXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICBjb25zdCB7ICcjdGFnJzogdGFnLCBwYXlsb2FkLCAuLi5yZXN0IH0gPSBlbmNvZGluZztcbiAgICAgICAgICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQoXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywgJyNlcnJvcicpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVzdWx0KSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW2VuY29kZWROYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBlbmNvZGVkTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgIGVuY29kZWROYW1lLFxuICAgICAgICAgICAgKX0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgZW5jb2RlZE5hbWUuY2hhckF0KDApICE9PSAnIycgfHxcbiAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xuICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbiAgICAgICAgICAgIHR5cGVvZiBlbmNvZGluZyxcbiAgICAgICAgICApfTogJHtlbmNvZGluZ31gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOaLU7BoLwAAaC8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBzdHJpbmdpZnk6IHF1b3RlIH0gPSBKU09OO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlciA9ICgpID0+IHtcbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICBsZXQgbGV2ZWwgPSAwO1xuICBsZXQgbmVlZFNwYWNlID0gZmFsc2U7XG4gIGNvbnN0IGxpbmUgPSAoKSA9PiB7XG4gICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgcmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywgJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4ge1xuICAgICAgbGV2ZWwgKz0gMTtcbiAgICAgIGlmIChuZWVkU3BhY2UpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuICAgIH0sXG4gICAgbGluZSxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAobmVlZFNwYWNlICYmIHRva2VuICE9PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmICghaXNPYmplY3QocmF3VHJlZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZih0YWcsICdzdHJpbmcnKTtcbiAgICAgICAgICBwcmVwYXJlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgICBOYXQoaW5kZXgpO1xuICAgICAgICAgIGlmIChpZmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKGlmYWNlLCAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgJ29yaWdpbmFsJyBpbiByYXdUcmVlIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbiAgICAgICAgICBwcmVwYXJlKG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyZXN0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUUNMQVNTIGluIHJlc3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIHByZXBhcmUocmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBhc3NlcnQuZmFpbChYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyYXdUcmVlKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgfVxuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlSW5kZW50ZXIgPSBzaG91bGRJbmRlbnQgPyBtYWtlWWVzSW5kZW50ZXIgOiBtYWtlTm9JbmRlbnRlcjtcbiAgbGV0IG91dCA9IG1ha2VJbmRlbnRlcigpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGUgPSByYXdUcmVlID0+IHtcbiAgICAvL1xuICAgIHJldHVybiByZWN1cihyYXdUcmVlKTtcbiAgfTtcblxuICBjb25zdCBkZWNvZGVQcm9wZXJ0eSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIG91dC5saW5lKCk7XG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgb3V0Lm5leHQoYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiAgICB9IGVsc2UgaWYgKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICBvdXQubmV4dChgJHtuYW1lfTpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lm5leHQoYCR7cXVvdGUobmFtZSl9OmApO1xuICAgIH1cbiAgICBkZWNvZGUodmFsdWUpO1xuICAgIG91dC5uZXh0KCcsJyk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgcmVjdXIgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHJhd1RyZWUpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICBhc3NlcnQudHlwZW9mKHFjbGFzcywgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoZGlnaXRzLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5uZXh0KGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBsZXQgeyBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFJlbmRlciA9IGFyZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRPdXQgPSBvdXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBvdXQgPSBtYWtlTm9JbmRlbnRlcigpO1xuICAgICAgICAgICAgICBkZWNvZGUoYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5kb25lKCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBvdXQgPSBvbGRPdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBzbG90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBuZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbiAgICAgICAgICAgIGlmIChpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9KWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkoUUNMQVNTLCBvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHJlc3QsICdvYmplY3QnKTtcbiAgICAgICAgICAgIGFzc2VydChyZXN0ICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgKX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIG5hbWUgIT09IGBBZ2dyZWdhdGVFcnJvcmAgfHxcbiAgICAgICAgICAgIEZhaWxgQWdncmVnYXRlRXJyb3Igbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgZXJyb3JzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbignWycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0LmxpbmUoKTtcbiAgICAgICAgICBkZWNvZGUocmF3VHJlZVtpXSk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyYXdUcmVlKSk7XG4gICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgne30nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJhd1RyZWVbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHByZXBhcmUoZW5jb2RpbmcpO1xuICBkZWNvZGUoZW5jb2RpbmcpO1xuICByZXR1cm4gb3V0LmRvbmUoKTtcbn07JGjNj19vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiAgICAgICAgICAgICAgICAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLy9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eU9mLHRvUGFzc2FibGVFcnJvcixYLEZhaWwscSxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixvYmplY3RNYXAsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKHRvUGFzc2FibGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaM2PX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbiA9IHggPT4geDtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuID0gKHgsIF8pID0+IHg7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXJzaGFsID0gKFxuICBjb252ZXJ0VmFsVG9TbG90ID0gZGVmYXVsdFZhbFRvU2xvdEZuLFxuICBjb252ZXJ0U2xvdFRvVmFsID0gZGVmYXVsdFNsb3RUb1ZhbEZuLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nID0gJ29uJyxcbiAgICBtYXJzaGFsTmFtZSA9ICdhbm9uLW1hcnNoYWwnLFxuICAgIC8vXG4gICAgLy9cbiAgICBlcnJvcklkTnVtID0gMTAwMDAsXG4gICAgLy9cbiAgICAvL1xuICAgIG1hcnNoYWxTYXZlRXJyb3IgPSBlcnIgPT5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgICAvL1xuICAgIC8vXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdjYXBkYXRhJyxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsICdzdHJpbmcnKTtcbiAgZXJyb3JUYWdnaW5nID09PSAnb24nIHx8XG4gICAgZXJyb3JUYWdnaW5nID09PSAnb2ZmJyB8fFxuICAgIEZhaWxgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbiAgY29uc3QgbmV4dEVycm9ySWQgPSAoKSA9PiB7XG4gICAgZXJyb3JJZE51bSArPSAxO1xuICAgIHJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gIH07XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gcm9vdCA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBlbmNvZGVTbG90Q29tbW9uID0gcGFzc2FibGUgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gc2xvdE1hcC5nZXQocGFzc2FibGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBzbG90cy5sZW5ndGg7XG4gICAgICBjb25zdCBzbG90ID0gY29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG4gICAgICBzbG90cy5wdXNoKHNsb3QpO1xuICAgICAgc2xvdE1hcC5zZXQocGFzc2FibGUsIGluZGV4KTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgLypcblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZW5jb2RlRXJyb3JDb21tb24gPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVuY29kZVJlY3VyKGAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBuYW1lID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm5hbWV9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChlcnJvclRhZ2dpbmcgPT09ICdvbicpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXJyb3JJZCA9IGVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKGVycm9ySWQsICdzdHJpbmcnKTtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnIsIFhgU2VudCBhcyAke2Vycm9ySWR9YCk7XG4gICAgICAgIG1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGVycm9ySWQsIG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdjYXBkYXRhJykge1xuICAgICAgLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YSA9IChwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGlmYWNlLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSAodmFsLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEodmFsLCBnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnZXJyb3InLCAuLi5lcnJEYXRhIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gbWFrZUVuY29kZVRvQ2FwRGF0YSh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvQ2FwRGF0YShyb290KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBib2R5LFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ3NtYWxsY2FwcycpIHtcbiAgICAgIC8qXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzID0gKHByZWZpeCwgcGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IChyZW1vdGFibGUsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJywgcmVtb3RhYmxlLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJywgcHJvbWlzZSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ucmVzdCB9ID0gZXJyRGF0YTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0IH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBtYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VGdWxsUmV2aXZlID0gc2xvdHMgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgdmFsTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlU2xvdENvbW1vbiA9IHNsb3REYXRhID0+IHtcbiAgICAgIGNvbnN0IHsgaWZhY2UgPSB1bmRlZmluZWQsIGluZGV4LCAuLi5yZXN0IH0gPSBzbG90RGF0YTtcbiAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgIGNvbnN0IGV4dGFudCA9IHZhbE1hcC5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGV4dGFudCkge1xuICAgICAgICByZXR1cm4gZXh0YW50O1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnZlcnRTbG90VG9WYWwoc2xvdCwgaWZhY2UpO1xuICAgICAgdmFsTWFwLnNldChpbmRleCwgdmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlRXJyb3JDb21tb24gPSAoZXJyRGF0YSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3JJZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfSA9IGVyckRhdGE7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZE5hbWUgPSBkZWNvZGVSZWN1cihuYW1lKTtcbiAgICAgIGNvbnN0IGRNZXNzYWdlID0gZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4gICAgICAvL1xuICAgICAgY29uc3QgZEVycm9ySWQgPSAvKiAgICAgICAgICAgICAgICAgKi8gKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICBkRXJyb3JJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICA6IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgIHNhbml0aXplOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoY2F1c2UpIHtcbiAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGRlY29kZVJlY3VyKGNhdXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvcnMgPSBkZWNvZGVSZWN1cihlcnJvcnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3RXJyb3IgPSBtYWtlRXJyb3IoZE1lc3NhZ2UsIGVyckNvbnN0cnVjdG9yLCBvcHRpb25zKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBkZXNjcyA9IG9iamVjdE1hcChyZXN0LCBkYXRhID0+ICh7XG4gICAgICAgIHZhbHVlOiBkZWNvZGVSZWN1cihkYXRhKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsIGRlc2NzKTtcbiAgICAgIGhhcmRlbihyYXdFcnJvcik7XG4gICAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKHJhd0Vycm9yKTtcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gKHJhd1RyZWUsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uc2xvdERhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLmVyckRhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tQ2FwRGF0YSA9IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcyA9IHByZWZpeCA9PiB7XG4gICAgICAvKlxuXG5cblxuICAgICAgICovXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgaSA9IHN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSwgaSA8IDAgPyB1bmRlZmluZWQgOiBpKSk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGlmYWNlID0gaSA8IDAgPyB1bmRlZmluZWQgOiBzdHJpbmdFbmNvZGluZy5zbGljZShpICsgMSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHsgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbiAgICBjb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSA9IGVuY29kaW5nO1xuICAgICAgIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8vXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLy9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqw1V3rLgAA6y4AACUAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLEZhaWwscSxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIixbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMsIHNldFByb3RvdHlwZU9mLCBpcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvID0gKHgsIHkpID0+IHggPT09IHkgfHwgaXMoeCwgeSk7XG5cbiAgICAgICBjb25zdCB0cml2aWFsQ29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT5cbiAgLy9cbiAgbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID09PSByaWdodCA/IDAgOiAxO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UudHJpdmlhbENvbXBhcmF0b3IodHJpdmlhbENvbXBhcmF0b3IpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgZnJvbUVudHJpZXMoXG4gICAgZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbiAgICAgIC8vXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcmVmaXhlcyA9PT0gWy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJykgfHxcbiAgICAgICAgICBGYWlsYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gW1xuICAgICAgICAgIHByZWZpeGVzLmNoYXJBdCgwKSxcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoIC0gMSkgKyAxKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFtwYXNzU3R5bGUsIHsgaW5kZXgsIGNvdmVyIH1dO1xuICAgICAgfSksXG4gIClcbik7XG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0UGFzc1N0eWxlQ292ZXIgPSBwYXNzU3R5bGUgPT4gcGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaM2PX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLypcblxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyYXRvcktpdCA9IChjb21wYXJlUmVtb3RhYmxlcyA9IChfeCwgX3kpID0+IE5hTikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgaWYgKHNhbWVWYWx1ZVplcm8obGVmdCwgcmlnaHQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gICAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLypcblxuICAgICAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxlZnQgPCByaWdodCkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQobGVmdCA+IHJpZ2h0KTtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSkge1xuICAgICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBpZiAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydChsZWZ0ID4gcmlnaHQpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGFiZWxDb21wID0gY29tcGFyYXRvcihnZXRUYWcobGVmdCksIGdldFRhZyhyaWdodCkpO1xuICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ29tcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8qICAgICAgICAgICAgICAgKi9cbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBvdXRlckNvbXBhcmF0b3IgPSAoeCwgeSkgPT5cbiAgICAvL1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoY29tcGFyYXRvcih4LCB5KSB8fCAwKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhbnRpQ29tcGFyYXRvciA9ICh4LCB5KSA9PiBvdXRlckNvbXBhcmF0b3IoeSwgeCk7XG5cbiAgbWVtb09mU29ydGVkLnNldChvdXRlckNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBtZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQob3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvcik7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLCBvdXRlckNvbXBhcmF0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBjb21wYXJhdG9yOiBvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yIH0pO1xufTtcbi8qXG5cblxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbiAgICAgICBjb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSBjb21wYXJhdG9yID0+XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuICAgICAgIGNvbnN0IGlzUmFua1NvcnRlZCA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpID09PSAnY29weUFycmF5Jyk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFzc2FibGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGNvbXBhcmUocGFzc2FibGVzW2kgLSAxXSwgcGFzc2FibGVzW2ldKSA+PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJhbmtTb3J0ZWQgPSAoc29ydGVkLCBjb21wYXJlKSA9PlxuICBpc1JhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKSB8fFxuICAvL1xuICAvL1xuICBGYWlsYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLCBjb21wYXJlKX1gOyRozY9fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzb3J0QnlSYW5rID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKSB7XG4gICAgaGFyZGVuKHBhc3NhYmxlcyk7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsIGNvbXBhcmUpKSB7XG4gICAgICByZXR1cm4gcGFzc2FibGVzO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bnNvcnRlZCA9IFsuLi5wYXNzYWJsZXNdO1xuICB1bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyogICAgICAgICAgICAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAEBlbmRvL25hdC12NS4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAL0dmpNCgAATQoAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3N0cmluZy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3N0cmluZy5qcyI6W1siaXNXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRQYXNzYWJsZVN0cmluZyJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbInRvVGhyb3dhYmxlIiwidG9UaHJvd2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw+/2RbwGAAC8BgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5LCBwcm90b3R5cGU6IGFycmF5UHJvdG90eXBlIH0gPSBBcnJheTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBDb3B5QXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5QXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gYXJyYXlQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBsZW4gPSAvKiAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAnbGVuZ3RoJywgZmFsc2UsIGFzc2VydENoZWNrZXIpLnZhbHVlXG4gICAgKTtcbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCBpLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gbGVuICsgMSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEIFEwPYIAAD2CAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxnZXRPd25EYXRhRGVzY3JpcHRvcixDWDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQgPSAoY2FuZGlkYXRlLCBrZXksIHZhbHVlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoIWNhbkJlTWV0aG9kKHZhbHVlKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgLy9cbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgQ29weVJlY29yZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlSZWNvcmQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSwgY2hlY2spICYmXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeShrZXkgPT5cbiAgICAgICAgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLCBrZXksIGNhbmRpZGF0ZVtrZXldLCBjaGVjayksXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBnZXRPd25EYXRhRGVzY3JpcHRvcihcbiAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cnVlLFxuICAgICAgICBhc3NlcnRDaGVja2VyLFxuICAgICAgKTtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpO1xuICAgIH1cbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkID0gYXN5bmMgdmFsID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cblxuICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHZhbCkpIHtcbiAgICByZXR1cm4gRS53aGVuKHZhbCwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIGNvbnN0IHJlYyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICBjb25zdCBuYW1lcyA9IC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJlYykpO1xuICAgICAgY29uc3QgdmFsUHMgPSBuYW1lcy5tYXAobmFtZSA9PiBkZWVwbHlGdWxmaWxsZWQocmVjW25hbWVdKSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT5cbiAgICAgICAgaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLCBpKSA9PiBbbmFtZXNbaV0sIGNdKSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgY29uc3QgYXJyID0gLyogICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdmFsUHMgPSBhcnIubWFwKHAgPT4gZGVlcGx5RnVsZmlsbGVkKHApKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PiBoYXJkZW4odmFscykpO1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyogICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vL1xuLy9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06KQfKQGAACkBgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyogICAgICAgICAgICAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLy9cbiAgLy9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8vXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8vXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLy9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8vXG4gIC8vXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLy9cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiAgICAgICAgICAgICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8vXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABwRFyEohcAAKIXAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0T3duRGF0YURlc2NyaXB0b3IiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldFByb3RvdHlwZU9mLFxuICBoYXNPd25Qcm9wZXJ0eTogb2JqZWN0SGFzT3duUHJvcGVydHksXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sLFxuKTtcbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPT09ICdmdW5jdGlvbicpO1xuXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IChvYmosIHByb3ApID0+XG4gIGFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LCBvYmosIFtwcm9wXSk7JGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbi8vXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gT2JqZWN0KHZhbCkgPT09IHZhbDskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzVHlwZWRBcnJheSA9IG9iamVjdCA9PiB7XG4gIC8vXG4gIGNvbnN0IHRhZyA9IGFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZywgb2JqZWN0LCBbXSk7XG4gIHJldHVybiB0YWcgIT09IHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbiAgICAgICBjb25zdCBQQVNTX1NUWUxFID0gU3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG4gICAgICAgY29uc3QgY2FuQmVNZXRob2QgPSBmdW5jID0+XG4gIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmICEoUEFTU19TVFlMRSBpbiBmdW5jKTskaM2PX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093blByb3BlcnR5T2YoZGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoc2hvdWxkQmVFbnVtZXJhYmxlXG4gICAgICA/IGRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApXG4gICAgICA6ICFkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpXG4gICAgPyBkZXNjXG4gICAgOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKC8qICAgICAgICAgICAgICAgICAgKi8gKHVuZGVmaW5lZCkpO1xufTskaM2PX29uY2UuZ2V0T3duRGF0YURlc2NyaXB0b3IoZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuaGFyZGVuKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldFRhZyA9IHRhZ1JlY29yZCA9PiB0YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaM2PX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuICAgICAgIGNvbnN0IGNoZWNrUGFzc1N0eWxlID0gKG9iaiwgcGFzc1N0eWxlLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICBwYXNzU3R5bGUgPT09IGV4cGVjdGVkUGFzc1N0eWxlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZCA9IGNoZWNrUHJvdG8gPT4ge1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1RhZ1JlY29yZCA9ICh0YWdSZWNvcmQsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAoaXNPYmplY3QodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAydba3TKwAA0ysAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxhc3NlcnRDaGVja2VyLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsWyRozY9fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIixbJGjNj19hID0+IChFcnJvckhlbHBlciA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLFskaM2PX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgY29weUFycmF5OiB1bmRlZmluZWQsXG4gICAgY29weVJlY29yZDogdW5kZWZpbmVkLFxuICAgIHRhZ2dlZDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgcmVtb3RhYmxlOiB1bmRlZmluZWQsXG4gIH07XG4gIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICBjb25zdCB7IHN0eWxlTmFtZSB9ID0gaGVscGVyO1xuICAgIHN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZSB8fCBGYWlsYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9IGhlbHBlcjtcbiAgfVxuICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSkge1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFZhbGlkID0gKGhlbHBlciwgY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gIGhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG4gIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2YgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSBtYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG4gIGNvbnN0IHJlbW90YWJsZUhlbHBlciA9IEhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBhc3NTdHlsZU1lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qXG5cbiAgICovXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZU9mID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGluUHJvZ3Jlc3MgPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZlJlY3VyID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgaW5uZXJJc09iamVjdCA9IGlzT2JqZWN0KGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIENvcHlSZWNvcmRIZWxwZXIsXG4gICAgVGFnZ2VkSGVscGVyLFxuICAgIEVycm9ySGVscGVyLFxuICAgIFJlbW90YWJsZUhlbHBlcixcbiAgXSk7JGjNj19vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlID0gdmFsID0+IHtcbiAgcGFzc1N0eWxlT2YodmFsKTsgLy9cbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgdHJ5IHtcbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSwgZGVzYywgcGFzc1N0eWxlT2YpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRvUGFzc2FibGVFcnJvciA9IGVyciA9PiB7XG4gIGhhcmRlbihlcnIpO1xuICBpZiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZikpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyO1xuICBjb25zdCB7IGNhdXNlOiBjYXVzZURlc2MsIGVycm9yczogZXJyb3JzRGVzYyB9ID1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvL1xuICAgIGNhdXNlLFxuICAgIGVycm9ycyxcbiAgfSk7XG4gIC8vXG4gIGhhcmRlbihuZXdFcnJvcik7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGFubm90YXRlRXJyb3IobmV3RXJyb3IsIFhgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG4gIHBhc3NTdHlsZU9mKG5ld0Vycm9yKSA9PT0gJ2Vycm9yJyB8fFxuICAgIEZhaWxgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG4gIHJldHVybiBuZXdFcnJvcjtcbn07JGjNj19vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b1Rocm93YWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgaGFyZGVuKHNwZWNpbWVuKTtcbiAgaWYgKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IoLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKSk7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICBpZiAoaXNPYmplY3Qoc3BlY2ltZW4pKSB7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudCA9PT0gdG9UaHJvd2FibGUoZWxlbWVudCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgY29uc3QgcmVjID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMocmVjKSkge1xuICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGcgPSAvKiAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGc7XG4gICAgICAgIHBheWxvYWQgPT09IHRvVGhyb3dhYmxlKHBheWxvYWQpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtwYXlsb2FkfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVyID0gLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZXIgPT09IHRvVGhyb3dhYmxlKGVyKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZXJ9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG59OyRozY9fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWcsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLy9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICBpc09iamVjdChvcmlnaW5hbCkgfHxcbiAgICBGYWlsYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuICBpZiAoXG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgIHByb3RvID09PSBudWxsIHx8XG4gICAgcHJvdG8gPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKFBBU1NfU1RZTEUpO1xuICBjb25zdCB0YWdLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBbLyogICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgLi4ucmVzdERlc2NzXG4gIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxuICByZXR1cm4gKFxuICAgIChvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSAmJlxuICAgIGNoZWNrSWZhY2UoaWZhY2UsIGNoZWNrKVxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzID0gbmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGUgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghaXNGcm96ZW4odmFsKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWBcbiAgICApO1xuICB9XG4gIC8vXG4gIGlmICghUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlT2YgPSB2YWwgPT4ge1xuICBpZiAoXG4gICAgIWlzT2JqZWN0KHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoaXNPYmplY3QoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICghaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KGtleSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLy9cbiAgICAgICAgICAoaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2YsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGlzRnJvemVuLCBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLCBrZXkpLFxuICApO1xuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YDtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNoZWNrU2FmZU93bktleSA9IGtleSA9PiB7XG4gICAgaWYgKGtleSA9PT0gdG9TdHJpbmdUYWcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgdGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihwciwgdG9TdHJpbmdUYWcpO1xuICAgICAgYXNzZXJ0KHRhZ0Rlc2MgIT09IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoaGFzT3duUHJvcGVydHlPZih0YWdEZXNjLCAndmFsdWUnKSB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EodGFnRGVzYyl9YCkgJiZcbiAgICAgICAgKHR5cGVvZiB0YWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkgJiZcbiAgICAgICAgKCF0YWdEZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgICBDWChjaGVjaylgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBwcltrZXldO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWwgIT09IG51bGwgJiZcbiAgICAgIGlzRnJvemVuKHZhbCkgJiZcbiAgICAgIGdldFByb3RvdHlwZU9mKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1YktleXMgPSBvd25LZXlzKHZhbCk7XG4gICAgICBpZiAoc3ViS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3ViS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgc3ViS2V5c1swXSA9PT0gJ2Rlc3Ryb3llZCcgJiZcbiAgICAgICAgdmFsLmRlc3Ryb3llZCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcbiAgICAgIFN0cmluZyhrZXkpLFxuICAgICl9IGlzICR7dmFsfWA7XG4gIH07XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlT3duS2V5KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlID0gKHByLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIChpc0Zyb3plbihwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSAmJlxuICAgIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgICAoZ2V0UHJvdG90eXBlT2YocHIpID09PSBQcm9taXNlLnByb3RvdHlwZSB8fFxuICAgICAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YocHIpLFxuICAgICAgKX1gKSAmJlxuICAgIGNoZWNrUHJvbWlzZU93bktleXMoLyogICAgICAgICAgICAgICAgICAqLyAocHIpLCBjaGVjaylcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzU2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCB4ID0+IHgpOyRozY9fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0U2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLy9cbmNvbnN0IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2QgPSAhIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzV2VsbEZvcm1lZFN0cmluZyA9IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2RcbiAgPyBzdHIgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmlzV2VsbEZvcm1lZCgpXG4gIDogc3RyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoIG9mIHN0cikge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBjcCA9IC8qICAgICAgICAgICAgICAgICAqLyAoY2guY29kZVBvaW50QXQoMCkpO1xuICAgICAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTskaM2PX29uY2UuaXNXZWxsRm9ybWVkU3RyaW5nKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oaXNXZWxsRm9ybWVkU3RyaW5nKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gc3RyID0+IHtcbiAgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cikgfHwgRmFpbGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbn07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4gICAgJ2VuYWJsZWQnLFxuICBdKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSBzdHIgPT4ge1xuICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBGYWlsYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuICAhT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFIHx8IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdG1R25QoAAOUKAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLy9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgaWYgKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW0gPSBTeW1ib2xbc3VmZml4XTtcbiAgICAgIGlmICh0eXBlb2Ygc3ltID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gc3ltO1xuICAgICAgfVxuICAgICAgRmFpbGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG59OyRozY9fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsZ2V0T3duRGF0YURlc2NyaXB0b3IsY2hlY2tQYXNzU3R5bGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsWyRozY9fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgVGFnZ2VkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAndGFnZ2VkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBjaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsIGNhbmRpZGF0ZVtQQVNTX1NUWUxFXSwgJ3RhZ2dlZCcsIGNoZWNrKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBjaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsICd0YWdnZWQnLCBhc3NlcnRDaGVja2VyKTtcblxuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoUEFTU19TVFlMRSk7XG4gICAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgICBjb25zdCB7XG4gICAgICAvL1xuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IF9sYWJlbERlc2MsXG4gICAgICBwYXlsb2FkOiBfcGF5bG9hZERlc2MsIC8vXG4gICAgICAuLi5yZXN0RGVzY3NcbiAgICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuICAgIC8vXG4gICAgLy9cbiAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAncGF5bG9hZCcsIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLHBhc3NTdHlsZU9mOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpc0NvcHlBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnY29weUFycmF5JzskaM2PX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUmVjb3JkID0gcmVjb3JkID0+IHBhc3NTdHlsZU9mKHJlY29yZCkgPT09ICdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBhcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnY29weUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG4gIHJlbW90YWJsZSxcbiAgb3B0TmFtZU9mUmVtb3RhYmxlID0gJ0FsbGVnZWQgcmVtb3RhYmxlJyxcbikgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP0XT32IGAABiBgAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVByb21pc2VLaXQoKSB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9ID0gbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xufVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gcmFjZVByb21pc2VzKHZhbHVlcykge1xuICByZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSwgdmFsdWVzKSk7XG59XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdYhBfmQCAABkAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKlxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKSA9PT0gbWF5YmVQcm9taXNlO1xufVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADnhrPBZCQAAWQkAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qL1xuXG5jb25zdCBpc09iamVjdCA9IHZhbHVlID0+IE9iamVjdCh2YWx1ZSkgPT09IHZhbHVlO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qga25vd25Qcm9taXNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IHJlY29yZCA9PiB7XG4gIGlmICghcmVjb3JkIHx8IHJlY29yZC5zZXR0bGVkKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSByZWNvcmQ7XG4gIE9iamVjdC5hc3NpZ24ocmVjb3JkLCB7XG4gICAgZGVmZXJyZWRzOiB1bmRlZmluZWQsXG4gICAgc2V0dGxlZDogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5mcmVlemUocmVjb3JkKTtcbiAgcmV0dXJuIGRlZmVycmVkcztcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQgPSB2YWx1ZSA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90cmFtcG9saW5lLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHJhbXBvbGluZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90cmFtcG9saW5lLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM14fpGzBwAAswcAACkAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9zcmMvdHJhbXBvbGluZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNUcmFtcG9saW5lIiwiZ2VuZXJhdG9yUHJvdG90eXBlIiwic3luY1RyYW1wb2xpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJzeW5jVHJhbXBvbGluZVwifSk7JGjNj19vbmNlLnN5bmNUcmFtcG9saW5lKHN5bmNUcmFtcG9saW5lKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJhc3luY1RyYW1wb2xpbmVcIn0pOyRozY9fb25jZS5hc3luY1RyYW1wb2xpbmUoYXN5bmNUcmFtcG9saW5lKTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG4gKi9cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgYmluZCB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuY29uc3QgdW5jdXJyeVRoaXMgPSBiaW5kLmJpbmQoYmluZC5jYWxsKTsgLy9cbiAgICAgICBjb25zdCB7IHByb3RvdHlwZTogZ2VuZXJhdG9yUHJvdG90eXBlIH0gPSBnZXRQcm90b3R5cGVPZihcbiAgLy9cbiAgZnVuY3Rpb24qICgpIHt9LFxuKTskaM2PX29uY2UuZ2VuZXJhdG9yUHJvdG90eXBlKGdlbmVyYXRvclByb3RvdHlwZSk7XG5jb25zdCBnZW5lcmF0b3JOZXh0ID0gdW5jdXJyeVRoaXMoZ2VuZXJhdG9yUHJvdG90eXBlLm5leHQpO1xuY29uc3QgZ2VuZXJhdG9yVGhyb3cgPSB1bmN1cnJ5VGhpcyhnZW5lcmF0b3JQcm90b3R5cGUudGhyb3cpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBzeW5jVHJhbXBvbGluZShnZW5lcmF0b3JGbiwgLi4uYXJncykge1xuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvckZuKC4uLmFyZ3MpO1xuICBsZXQgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvcik7XG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvciwgcmVzdWx0LnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclRocm93KGl0ZXJhdG9yLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY1RyYW1wb2xpbmUoZ2VuZXJhdG9yRm4sIC4uLmFyZ3MpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3JGbiguLi5hcmdzKTtcbiAgbGV0IHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IpO1xuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWwgPSBhd2FpdCByZXN1bHQudmFsdWU7XG4gICAgICByZXN1bHQgPSBnZW5lcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yVGhyb3coaXRlcmF0b3IsIGVycik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0b3JQcm90b3R5cGUiOlsiZ2VuZXJhdG9yUHJvdG90eXBlIl0sInN5bmNUcmFtcG9saW5lIjpbInN5bmNUcmFtcG9saW5lIl0sImFzeW5jVHJhbXBvbGluZSI6WyJhc3luY1RyYW1wb2xpbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvP8BQ5oCAACaAgAAGQAAAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9yZWFkZXIuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9yZWFkZXIuanNcIiwgW11dLFtcIi4vc3JjL3dyaXRlci5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL3JlYWRlci5qcyI6W1siWmlwUmVhZGVyIiwiWmlwUmVhZGVyIl0sWyJyZWFkWmlwIiwicmVhZFppcCJdXSwiLi9zcmMvd3JpdGVyLmpzIjpbWyJaaXBXcml0ZXIiLCJaaXBXcml0ZXIiXSxbIndyaXRlWmlwIiwid3JpdGVaaXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVWounBFAAAwRQAACUAAABAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItcmVhZGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJSZWFkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwcml2YXRlRmllbGRzID0gbmV3IFdlYWtNYXAoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkc0dldCA9IHByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbiAgICAgICBjbGFzcyBCdWZmZXJSZWFkZXIge1xuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGxlbmd0aDogYnl0ZXMubGVuZ3RoLFxuICAgICAgaW5kZXg6IDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzZXQgb2Zmc2V0KG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKG9mZnNldCA+IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGgpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBzZXQgbmVnYXRpdmUgb2Zmc2V0Jyk7XG4gICAgfVxuICAgIGZpZWxkcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgZmllbGRzLmxlbmd0aCA9IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGggLSBmaWVsZHMub2Zmc2V0O1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNhblNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGZpZWxkcy5vZmZzZXQgKyBpbmRleCA8PSBmaWVsZHMubGVuZ3RoO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBhc3NlcnRDYW5TZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoIXRoaXMuY2FuU2VlayhpbmRleCkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc2VlayhpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgY29uc3QgcmVzdG9yZSA9IGZpZWxkcy5pbmRleDtcbiAgICB0aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuICAgIGZpZWxkcy5pbmRleCA9IGluZGV4O1xuICAgIHJldHVybiByZXN0b3JlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBwZWVrKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIC8vXG4gICAgc2l6ZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGZpZWxkcy5sZW5ndGggLSBmaWVsZHMuaW5kZXgsIHNpemUpKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuICAgICAgZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleCxcbiAgICAgIGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXggKyBzaXplLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGNhblJlYWQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBhc3NlcnRDYW5SZWFkKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICByZWFkKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlZWsoc2l6ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHJlYWRVaW50OCgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXg7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkVWludDE2KGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleDtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkcy5kYXRhLmdldFVpbnQxNihpbmRleCwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoNCk7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4O1xuICAgIGNvbnN0IHZhbHVlID0gZmllbGRzLmRhdGEuZ2V0VWludDMyKGluZGV4LCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgYnl0ZUF0KGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQgKyBpbmRleF07XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBza2lwKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5zZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGV4cGVjdChleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LCBleHBlY3RlZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmllbGRzLmluZGV4ICs9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBtYXRjaEF0KGluZGV4LCBleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKGluZGV4ICsgZXhwZWN0ZWQubGVuZ3RoID4gZmllbGRzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKGV4cGVjdGVkW2ldICE9PSB0aGlzLmJ5dGVBdChpbmRleCArIGkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBhc3NlcnQoZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmICghdGhpcy5leHBlY3QoZXhwZWN0ZWQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkICR7cShleHBlY3RlZCl9IGF0ICR7ZmllbGRzLmluZGV4fSwgZ290ICR7dGhpcy5wZWVrKFxuICAgICAgICAgIGV4cGVjdGVkLmxlbmd0aCxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGZpbmRMYXN0KGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBsZXQgaW5kZXggPSBmaWVsZHMubGVuZ3RoIC0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIHdoaWxlIChpbmRleCA+PSAwICYmICF0aGlzLm1hdGNoQXQoaW5kZXgsIGV4cGVjdGVkKSkge1xuICAgICAgaW5kZXggLT0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59JGjNj19vbmNlLiAgIEJ1ZmZlclJlYWRlcihCdWZmZXJSZWFkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHMgPSBzZWxmID0+IHtcbiAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXIgPSBuID0+IHtcbiAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pICYmIC8qICAgICAgICAgICAgICAgICAqLyAobikgPj0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBUeXBlRXJyb3IoYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbn07XG5cbiAgICAgICBjbGFzcyBCdWZmZXJXcml0ZXIge1xuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDE2KSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgY2FwYWNpdHksXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIGxldCBjYXBhY2l0eSA9IGZpZWxkcy5jYXBhY2l0eTtcbiAgICB3aGlsZSAoY2FwYWNpdHkgPCByZXF1aXJlZCkge1xuICAgICAgY2FwYWNpdHkgKj0gMjtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIGJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkpO1xuICAgIGZpZWxkcy5ieXRlcyA9IGJ5dGVzO1xuICAgIGZpZWxkcy5kYXRhID0gZGF0YTtcbiAgICBmaWVsZHMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5Xcml0ZShzaXplKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCArIHNpemUpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgd3JpdGUoYnl0ZXMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gICAgZmllbGRzLmJ5dGVzLnNldChieXRlcywgZmllbGRzLmluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVDb3B5KHN0YXJ0LCBlbmQpIHtcbiAgICBhc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuICAgIGFzc2VydE5hdE51bWJlcihlbmQpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgY29uc3Qgc2l6ZSA9IGVuZCAtIHN0YXJ0O1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG4gICAgZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LCBzdGFydCwgZW5kKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHdyaXRlVWludDgodmFsdWUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LCB2YWx1ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlVWludDE2KHZhbHVlLCBsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMuaW5kZXg7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LCB2YWx1ZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVVaW50MzIodmFsdWUsIGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5pbmRleDtcbiAgICBmaWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsIHZhbHVlLCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLCBlbmQpLnNsaWNlKCk7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAABAZW5kby96aXAtdjEuMC45L3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLy9cbiAgICAgICBjb25zdCBTVE9SRSA9IDA7JGjNj19vbmNlLlNUT1JFKFNUT1JFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy9jcmMzMi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY3JjMzIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCduYW1lJyx7dmFsdWU6XCJjcmMzMlwifSk7JGjNj19vbmNlLmNyYzMyKGNyYzMyKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIGxldCBjO1xuICBjb25zdCB0YWJsZSA9IFtdO1xuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgMjU2OyBuICs9IDEpIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IDg7IGsgKz0gMSkge1xuICAgICAgYyA9IGMgJiAxID8gMHhlZGI4ODMyMCBeIChjID4+PiAxKSA6IGMgPj4+IDE7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy9cbmNvbnN0IHRhYmxlID0gbWFrZVRhYmxlKCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGNyYzMyKGJ5dGVzLCBsZW5ndGggPSBieXRlcy5sZW5ndGgsIGluZGV4ID0gMCwgY3JjID0gMCkge1xuICBjb25zdCBlbmQgPSBpbmRleCArIGxlbmd0aDtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgZW5kOyBpICs9IDEpIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiBieXRlc1tpXSkgJiAweGZmXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gLTEpID4+PiAwO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmapkq54qAACeKgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwnbmFtZScse3ZhbHVlOlwicmVhZFppcFwifSk7JGjNj19vbmNlLnJlYWRaaXAocmVhZFppcCk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZykge1xuICByZXR1cm4gKGJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcikge1xuICBjb25zdCBkb3NUaW1lID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIHJldHVybiBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgICgoZG9zVGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vXG4gICAgICAoKGRvc1RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvL1xuICAgICAgKGRvc1RpbWUgPj4gMTYpICYgMHgxZiwgLy9cbiAgICAgIChkb3NUaW1lID4+IDExKSAmIDB4MWYsIC8vXG4gICAgICAoZG9zVGltZSA+PiA1KSAmIDB4M2YsIC8vXG4gICAgICAoZG9zVGltZSAmIDB4MWYpIDw8IDEgIC8vXG4gICAgKSxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcikge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb25OZWVkZWQ6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGJpdEZsYWc6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBkYXRlOiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbiAgICBjcmMzMjogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgY29tcHJlc3NlZExlbmd0aDogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiByZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVWludDgoKTtcbiAgY29uc3QgbWFkZUJ5ID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbiAgY29uc3QgZmlsZVN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbiAgY29uc3QgbmFtZSA9IHJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuICAvL1xuICByZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgaWYgKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cbiAgaWYgKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG4gIGlmIChmaWxlU3RhcnQgPT09IE1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuICBpZiAoZGlza051bWJlclN0YXJ0ID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cblxuICBjb25zdCBjb21tZW50ID0gcmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgbWFkZUJ5LFxuICAgIC4uLmhlYWRlcnMsXG4gICAgZGlza051bWJlclN0YXJ0LFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbiAgICBmaWxlU3RhcnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKSB7XG4gIGNvbnN0IHsgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgY2VudHJhbERpcmVjdG9yeVJlY29yZHMgfSA9IGxvY2F0b3I7XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgd2hpbGUgKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgY29uc3QgZW50cnkgPSByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgIC8vXG4gICAgLy9cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgJHtjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc30gcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICR7ZW50cmllcy5sZW5ndGh9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkRmlsZShyZWFkZXIpIHtcbiAgcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4gIHJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcbiAgY29uc3QgY29udGVudCA9IHJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG4gIHJldHVybiB7IG5hbWUsIC4uLmhlYWRlcnMsIGNvbnRlbnQgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZExvY2FsRmlsZXMocmVhZGVyLCByZWNvcmRzKSB7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICByZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbiAgICBjb25zdCBmaWxlID0gcmVhZEZpbGUocmVhZGVyKTtcbiAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICB9XG4gIHJldHVybiBmaWxlcztcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpIHtcbiAgaWYgKCFyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycsXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaXNrTnVtYmVyID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZSA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIGNvbnN0IGNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG4gIHJldHVybiB7XG4gICAgZGlza051bWJlcixcbiAgICBkaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG4gICAgY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemUsXG4gICAgY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZCA9IHJlYWRlci5sZW5ndGggLSAyMjtcbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlFbmQgPCAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuICB9XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuICBjb25zdCBsb2NhdG9yID0gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgemlwNjQgPVxuICAgIGxvY2F0b3IuZGlza051bWJlciA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHMgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplID09PSBNQVhfVkFMVUVfMzJCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID09PSBNQVhfVkFMVUVfMzJCSVRTO1xuXG4gIGlmICh6aXA2NCkge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemVcbiAgICAvL1xuICB9ID0gbG9jYXRvcjtcblxuICBjb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQgPVxuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgKyBjZW50cmFsRGlyZWN0b3J5U2l6ZTtcbiAgY29uc3QgZXh0cmFCeXRlcyA9IGNlbnRyYWxEaXJlY3RvcnlFbmQgLSBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ7XG5cbiAgcmVhZGVyLm9mZnNldCA9IGV4dHJhQnl0ZXM7XG5cbiAgcmV0dXJuIGxvY2F0b3I7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCwgYXJjaGl2ZU5hbWUpIHtcbiAgY29uc3QgY2VudHJhbE5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbiAgY29uc3QgbG9jYWxOYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykgIT09IGxvY2FsTmFtZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG4gICAgICAgIGNlbnRyYWxOYW1lLFxuICAgICAgKX0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICBhcmNoaXZlTmFtZSxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBmdW5jdGlvbiBjaGVjayh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG4gICAgICAgICAgbG9jYWxOYW1lLFxuICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5iaXRGbGFnID09PSBsb2NhbFJlY29yZC5iaXRGbGFnLFxuICAgIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbiAgICAgIDE2LFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCA9PT0gbG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCxcbiAgKTtcbiAgLy9cbiAgLy9cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jcmMzMiA9PT0gbG9jYWxSZWNvcmQuY3JjMzIsXG4gICAgYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gLFxuICApO1xuICBjaGVjayhcbiAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiAgICBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gLFxuICApO1xuXG4gIGNvbnN0IGNoZWNrc3VtID0gY3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG4gIGNoZWNrKFxuICAgIGNoZWNrc3VtID09PSBsb2NhbFJlY29yZC5jcmMzMixcbiAgICBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCxcbiAgKTtcbn1cblxuLypcblxuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIChleHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4ZmZmZjtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsIGxvY2FsUmVjb3JkKSB7XG4gIGNvbnN0IG1vZGUgPSBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2VudHJhbFJlY29yZC5uYW1lLFxuICAgIG1vZGUsXG4gICAgZGF0ZTogY2VudHJhbFJlY29yZC5kYXRlLFxuICAgIGNyYzMyOiBjZW50cmFsUmVjb3JkLmNyYzMyLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGxvY2FsUmVjb3JkLmNvbnRlbnQsXG4gICAgY29tbWVudDogY2VudHJhbFJlY29yZC5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSkge1xuICBpZiAoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCAhPT0gY29tcHJlc3Npb24uU1RPUkUpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICAgIGZpbGUuY29tcHJlc3Npb25NZXRob2QsXG4gICAgICApfSBmb3IgZmlsZSAke2ZpbGUubmFtZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlRmlsZShmaWxlKSB7XG4gIGNvbnN0IG5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIG1vZGU6IGZpbGUubW9kZSAmIDBvNzc3LFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByZWFkWmlwKHJlYWRlciwgbmFtZSA9ICc8dW5rbm93bj4nKSB7XG4gIGNvbnN0IGxvY2F0b3IgPSByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcik7XG4gIGNvbnN0IGNlbnRyYWxSZWNvcmRzID0gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKTtcbiAgY29uc3QgbG9jYWxSZWNvcmRzID0gcmVhZExvY2FsRmlsZXMocmVhZGVyLCBjZW50cmFsUmVjb3Jkcyk7XG4gIGNvbnN0IGZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2VudHJhbFJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjZW50cmFsUmVjb3JkID0gY2VudHJhbFJlY29yZHNbaV07XG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBsb2NhbFJlY29yZHNbaV07XG5cbiAgICBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQsIG5hbWUpO1xuXG4gICAgaWYgKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpIHtcbiAgICAgIHRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXIgPSAoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwKSAhPT0gMDtcbiAgICBpZiAoIWlzRGlyKSB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWRGaWxlID0gZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuICAgICAgY29uc3QgZGVjb2RlZEZpbGUgPSBkZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuICAgICAgZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsIGRlY29kZWRGaWxlKTtcbiAgICB9XG4gICAgLy9cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC13cml0ZXIuanN7ImltcG9ydHMiOlsiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbIndyaXRlWmlwIiwid3JpdGVaaXBSZWNvcmRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCduYW1lJyx7dmFsdWU6XCJ3cml0ZVppcFJlY29yZHNcIn0pOyRozY9fb25jZS53cml0ZVppcFJlY29yZHMod3JpdGVaaXBSZWNvcmRzKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXAsJ25hbWUnLHt2YWx1ZTpcIndyaXRlWmlwXCJ9KTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWCA9IDM7XG5jb25zdCBVTklYX1ZFUlNJT04gPSAzMDtcblxuY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlciwgZGF0ZSkge1xuICBjb25zdCBkb3NUaW1lID1cbiAgICBkYXRlICE9PSB1bmRlZmluZWQgJiYgZGF0ZSAhPT0gbnVsbFxuICAgICAgPyAoKChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLSAxOTgwKSAmIDB4N2YpIDw8IDI1KSB8IC8vXG4gICAgICAgICgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgPDwgMjEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDRGF0ZSgpIDw8IDE2KSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ0hvdXJzKCkgPDwgMTEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDTWludXRlcygpIDw8IDUpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDU2Vjb25kcygpID4+IDEpIC8vXG4gICAgICA6IDA7IC8vXG4gIHdyaXRlci53cml0ZVVpbnQzMihkb3NUaW1lLCB0cnVlKTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlciwgZmlsZSkge1xuICAvL1xuICBjb25zdCBmaWxlU3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgLy9cbiAgd3JpdGVyLndyaXRlVWludDE2KDEwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuYml0RmxhZywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbXByZXNzaW9uTWV0aG9kLCB0cnVlKTtcbiAgd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsIGZpbGUuZGF0ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmNyYzMyLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLnVuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLm5hbWUubGVuZ3RoLCB0cnVlKTtcbiAgY29uc3QgaGVhZGVyRW5kID0gd3JpdGVyLmxlbmd0aDtcblxuICAvL1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLm5hbWUpO1xuICAvL1xuICB3cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxuICByZXR1cm4ge1xuICAgIGZpbGVTdGFydCxcbiAgICBoZWFkZXJTdGFydCxcbiAgICBoZWFkZXJFbmQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCBmaWxlLCBsb2NhdG9yKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUudmVyc2lvbik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbiAgd3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LCBsb2NhdG9yLmhlYWRlckVuZCk7XG4gIC8vXG4gIHdyaXRlci53cml0ZVVpbnQxNigwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tbWVudC5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5kaXNrTnVtYmVyU3RhcnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihsb2NhdG9yLmZpbGVTdGFydCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLmNlbnRyYWxOYW1lKTtcbiAgLy9cbiAgd3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG59XG5cbi8qXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbiAgd3JpdGVyLFxuICBlbnRyaWVzQ291bnQsXG4gIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbiAgY29tbWVudEJ5dGVzLFxuKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeVN0YXJ0LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGNvbW1lbnRCeXRlcy5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoY29tbWVudEJ5dGVzKTtcbn1cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIHJlY29yZHMsIGNvbW1lbnQgPSAnJykge1xuICAvL1xuICBjb25zdCBsb2NhdG9ycyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBsb2NhdG9ycy5wdXNoKHdyaXRlRmlsZSh3cml0ZXIsIHJlY29yZHNbaV0pKTtcbiAgfVxuXG4gIC8vXG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhdG9ycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCByZWNvcmRzW2ldLCBsb2NhdG9yc1tpXSk7XG4gIH1cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aCA9IHdyaXRlci5pbmRleCAtIGNlbnRyYWxEaXJlY3RvcnlTdGFydDtcblxuICBjb25zdCBjb21tZW50Qnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbiAgLy9cbiAgd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG4gICAgd3JpdGVyLFxuICAgIHJlY29yZHMubGVuZ3RoLFxuICAgIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuICAgIGNvbW1lbnRCeXRlcyxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUZpbGUoZmlsZSkge1xuICBjb25zdCBuYW1lID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUubmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICBjb25zdCBjb21tZW50ID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgIGNvbnRlbnQ6IGZpbGUuY29udGVudCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjcmMzMjogY3JjMzIoZmlsZS5jb250ZW50KSxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY29tcHJlc3Npb24uU1RPUkUsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb250ZW50Lmxlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29udGVudC5sZW5ndGgsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKG1vZGUpIHtcbiAgcmV0dXJuICgobW9kZSAmIDBvNzc3KSB8IDBvMTAwMDAwKSA8PCAxNjtcbn1cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbGVSZWNvcmQoZmlsZSkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICBjZW50cmFsTmFtZTogZmlsZS5uYW1lLFxuICAgIG1hZGVCeTogVU5JWCxcbiAgICB2ZXJzaW9uOiBVTklYX1ZFUlNJT04sXG4gICAgdmVyc2lvbk5lZWRlZDogMCwgLy9cbiAgICBiaXRGbGFnOiAwLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjb21wcmVzc2lvbi5TVE9SRSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY3JjMzI6IGZpbGUuY3JjMzIsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIHVuY29tcHJlc3NlZExlbmd0aDogZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsXG4gICAgZGlza051bWJlclN0YXJ0OiAwLFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXM6IDAsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlczogZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhmaWxlLm1vZGUpLFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiB3cml0ZVppcCh3cml0ZXIsIGZpbGVzLCBjb21tZW50ID0gJycpIHtcbiAgY29uc3QgZW5jb2RlZEZpbGVzID0gZmlsZXMubWFwKGVuY29kZUZpbGUpO1xuICBjb25zdCBjb21wcmVzc2VkRmlsZXMgPSBlbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4gIC8vXG4gIGNvbnN0IGZpbGVSZWNvcmRzID0gY29tcHJlc3NlZEZpbGVzLm1hcChtYWtlRmlsZVJlY29yZCk7XG4gIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIGZpbGVSZWNvcmRzLCBjb21tZW50KTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyaXRlWmlwUmVjb3JkcyI6WyJ3cml0ZVppcFJlY29yZHMiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZDKALJYGAACWBgAAHgAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyUmVhZGVyLHJlYWRaaXBGb3JtYXQ7JGjNj19pbXBvcnRzKFtbXCIuL2J1ZmZlci1yZWFkZXIuanNcIiwgW1tcIkJ1ZmZlclJlYWRlclwiLFskaM2PX2EgPT4gKEJ1ZmZlclJlYWRlciA9ICRozY9fYSldXV1dLFtcIi4vZm9ybWF0LXJlYWRlci5qc1wiLCBbW1wicmVhZFppcFwiLFskaM2PX2EgPT4gKHJlYWRaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwUmVhZGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbmFtZSA9ICc8dW5rbm93bj4nIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoZGF0YSk7XG4gICAgdGhpcy5maWxlcyA9IHJlYWRaaXBGb3JtYXQocmVhZGVyKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkKG5hbWUpIHtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5maWxlcy5nZXQobmFtZSk7XG4gICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGUuY29udGVudDtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc3RhdChuYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gICAgfTtcbiAgfVxufVxuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLiBaaXBSZWFkZXIoWmlwUmVhZGVyKTtcbiAgICAgICBjb25zdCByZWFkWmlwID0gYXN5bmMgKGRhdGEsIGxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBaaXBSZWFkZXIoZGF0YSwgeyBuYW1lOiBsb2NhdGlvbiB9KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlYWQgPSBhc3luYyBwYXRoID0+IHJlYWRlci5yZWFkKHBhdGgpO1xuICByZXR1cm4geyByZWFkIH07XG59OyRozY9fb25jZS5yZWFkWmlwKHJlYWRaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwUmVhZGVyIjpbIlppcFJlYWRlciJdLCJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3NpZ25hdHVyZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiQ0VOVFJBTF9GSUxFX0hFQURFUiIsIkRBVEFfREVTQ1JJUFRPUiIsIkxPQ0FMX0ZJTEVfSEVBREVSIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHUoc3RyaW5nKSB7XG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc3RyaW5nLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgYXJyYXlbaV0gPSBzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4gICAgICAgY29uc3QgTE9DQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAzXFx4MDQnKTskaM2PX29uY2UuTE9DQUxfRklMRV9IRUFERVIoTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgIGNvbnN0IENFTlRSQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAxXFx4MDInKTskaM2PX29uY2UuQ0VOVFJBTF9GSUxFX0hFQURFUihDRU5UUkFMX0ZJTEVfSEVBREVSKTtcbiAgICAgICBjb25zdCBDRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSB1KCdQS1xceDA1XFx4MDYnKTskaM2PX29uY2UuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKENFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgY29uc3QgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9IHUoJ1BLXFx4MDZcXHgwNycpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgIGNvbnN0IFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCA9IHUoJ1BLXFx4MDZcXHgwNicpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICBjb25zdCBEQVRBX0RFU0NSSVBUT1IgPSB1KCdQS1xceDA3XFx4MDgnKTskaM2PX29uY2UuREFUQV9ERVNDUklQVE9SKERBVEFfREVTQ1JJUFRPUik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJMT0NBTF9GSUxFX0hFQURFUiI6WyJMT0NBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0ZJTEVfSEVBREVSIjpbIkNFTlRSQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJEQVRBX0RFU0NSSVBUT1IiOlsiREFUQV9ERVNDUklQVE9SIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj63iQDQcAAA0HAAAeAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXdyaXRlci5qcyIsIi4vZm9ybWF0LXdyaXRlci5qcyJdLCJleHBvcnRzIjpbIlppcFdyaXRlciIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyV3JpdGVyLHdyaXRlWmlwRm9ybWF0OyRozY9faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIixbJGjNj19hID0+IChCdWZmZXJXcml0ZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsWyRozY9fYSA9PiAod3JpdGVaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwV3JpdGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7IGRhdGU6IG5ldyBEYXRlKCkgfSkge1xuICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3B0aW9ucztcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHRoaXMuZmlsZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kYXRlID0gZGF0ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIHdyaXRlKG5hbWUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbW9kZSA9IDBvNjQ0LCBkYXRlID0gdW5kZWZpbmVkLCBjb21tZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0aHJvdyBFcnJvcihgWmlwV3JpdGVyIHdyaXRlIHJlcXVpcmVzIGNvbnRlbnQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5maWxlcy5zZXQobmFtZSwge1xuICAgICAgbmFtZSxcbiAgICAgIG1vZGUsXG4gICAgICBkYXRlLFxuICAgICAgY29udGVudCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzbmFwc2hvdCgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKCk7XG4gICAgd3JpdGVaaXBGb3JtYXQod3JpdGVyLCBBcnJheS5mcm9tKHRoaXMuZmlsZXMudmFsdWVzKCkpKTtcbiAgICByZXR1cm4gd3JpdGVyLnN1YmFycmF5KCk7XG4gIH1cbn1cblxuLypcblxuICovJGjNj19vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbiAgICAgICBjb25zdCB3cml0ZVppcCA9ICgpID0+IHtcbiAgY29uc3Qgd3JpdGVyID0gbmV3IFppcFdyaXRlcigpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdyaXRlID0gYXN5bmMgKHBhdGgsIGRhdGEpID0+IHtcbiAgICB3cml0ZXIud3JpdGUocGF0aCwgZGF0YSk7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc25hcHNob3QgPSBhc3luYyAoKSA9PiB3cml0ZXIuc25hcHNob3QoKTtcbiAgcmV0dXJuIHsgd3JpdGUsIHNuYXBzaG90IH07XG59OyRozY9fb25jZS53cml0ZVppcCh3cml0ZVppcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJaaXBXcml0ZXIiOlsiWmlwV3JpdGVyIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAFPN5Fa9wAACvcAAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAH1sUNdkEAADZBAAAKQAAAAAAAAAAAAAApIHhcAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOC9zcmMvdmF0LXNwYXduZWQuanNQSwECHgMKAAAAAAAAAAAAONScZ3UCAAB1AgAAGwAAAAAAAAAAAAAApIEBdgAAQGVuZG8vYmFzZTY0LXYxLjAuOS9hdG9iLmpzUEsBAh4DCgAAAAAAAAAAAJLCk480AwAANAMAABsAAAAAAAAAAAAAAKSBr3gAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAAEe3Z/uQEAALkBAAAdAAAAAAAAAAAAAACkgRx8AABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAAChVqVIuQEAALkBAAAdAAAAAAAAAAAAAACkgRB+AABAZW5kby9iYXNlNjQtdjEuMC45L2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAAAAAAAAAAACkgQSAAABAZW5kby9iYXNlNjQtdjEuMC45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAAAAAAAAAAAAAKSB4oIAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2NvbW1vbi5qc1BLAQIeAwoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAAAAAAAAAAACkgViGAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAAAAAAAAAAAApIEpjwAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAAAAAAAAAAAAAKSB05YAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAtwVrcH0CAAB9AgAAMQAAAAAAAAAAAAAApIFHmgAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAAAoxQXujC0AAIwtAAA2AAAAAAAAAAAAAACkgROdAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAAAAAAAAAAAApIHzygAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAAAAAAAAAAAAAKSBe84AAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLWxpdGUuanNQSwECHgMKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAAAAAAAAAAAApIGC/AAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1BLAQIeAwoAAAAAAAAAAACXFCXU3AgAANwIAAA1AAAAAAAAAAAAAACkgRMCAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAAAAAAAAAAACkgUILAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtaG9vay5qc1BLAQIeAwoAAAAAAAAAAACyboTrLgMAAC4DAAArAAAAAAAAAAAAAACkgfFUAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzUEsBAh4DCgAAAAAAAAAAAFRdc4GPJQAAjyUAACsAAAAAAAAAAAAAAKSBaFgBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanNQSwECHgMKAAAAAAAAAAAA24zvzDwXAAA8FwAAMQAAAAAAAAAAAAAApIFAfgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvbWFwLXBhcnNlci5qc1BLAQIeAwoAAAAAAAAAAACbHJrWzwsAAM8LAAA8AAAAAAAAAAAAAACkgcuVAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAAAAAAAAAAAApIH0oQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAAdTVibqkTAACpEwAARgAAAAAAAAAAAAAApIGSpwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAAB+v1bmRAUAAEQFAAAxAAAAAAAAAAAAAACkgZ+7AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAAJNW0lQeCAAAHggAADQAAAAAAAAAAAAAAKSBMsEBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAAAAAAAAAAAApIGiyQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAAB2YD3s+gQAAPoEAAAxAAAAAAAAAAAAAACkgUXPAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAAAbk/GrVGAAA1RgAADQAAAAAAAAAAAAAAKSBjtQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAA8T/NJj4qAAA+KgAALQAAAAAAAAAAAAAApIG17QEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAK9oe6XcCAAA3AgAAC0AAAAAAAAAAAAAAKSBPhgCAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAA1AAAAAAAAAAAAAACkgWUhAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy90eXBlcy1leHRlcm5hbC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAhAAAAAAAAAAAAAACkgRAjAgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALrCJHboPAAC6DwAAKwAAAAAAAAAAAAAApIHxJAIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAAAAAAAAAAACkgfQ0AgBAZW5kby9lcnJvcnMtdjEuMi4xMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADJsYMZGxYAABsWAAAjAAAAAAAAAAAAAACkgYM9AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAAAAAAAAAAACkgd9TAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAAAAAAAAAAACkgX5VAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAAAAAAAAAAAApIFUZAIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAuHaUnV8DAABfAwAAKQAAAAAAAAAAAAAApIHjcwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAqYDDs54KAACeCgAALQAAAAAAAAAAAAAApIGJdwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAAAAAAAAAAAAAKSBcoICAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAAAAAAAAAAAAAKSBF4UCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAKu2xWGKFgAAihYAACcAAAAAAAAAAAAAAKSBw5ECAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAt1VAGggcAAIIHAAAdAAAAAAAAAAAAAACkgZKoAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACVfGWZmk8AAJpPAAAqAAAAAAAAAAAAAACkgU+wAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAAAAAAAAAAAApIExAAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAAD2GBtPQSwAAEEsAAAtAAAAAAAAAAAAAACkgW4sAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAA5otTsGgvAABoLwAAKgAAAAAAAAAAAAAApIH6WAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAAL4ipxtKBwAASgcAAC0AAAAAAAAAAAAAAKSBqogDAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAAAAAAAAAAACkgT+QAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABKsNVd6y4AAOsuAAAlAAAAAAAAAAAAAACkgeG/AwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAAAAAAAAAAAAAKSBD+8DAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABenLPKzAUAAMwFAAAdAAAAAAAAAAAAAACkgabwAwBAZW5kby9uYXQtdjUuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAC9HZqTQoAAE0KAAAgAAAAAAAAAAAAAACkga32AwBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAAAAAAAAAAACkgTgBBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAABCBRMD2CAAA9ggAACkAAAAAAAAAAAAAAKSBOggEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAAAAAAAAAAAAAKSBdxEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAAAAAAAAAAAApIFhHQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANOikHykBgAApAYAACsAAAAAAAAAAAAAAKSBdjIEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAAAAAAAAAAAApIFjOQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAAAAAAAAAAAAAKSBgUwEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHBEXISiFwAAohcAADAAAAAAAAAAAAAAAKSBpFEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMnW2t0ysAANMrAAAqAAAAAAAAAAAAAACkgZRpBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAAAAAAAAAAAApIGvlQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAAAAAAAAAAACkgaOyBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAAAAAAAAAAAAAKSBZsEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAHRtUduUKAADlCgAAJQAAAAAAAAAAAAAApIEiygQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAAAAAAAAAAACkgUrVBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAAAAAAAAAAAAAKSBVt0EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBBOcEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAAAAAAAAAAACkgZ7oBABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAAAAAAAAAAAAAKSBQO8EAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAOeGs8FkJAABZCQAAKgAAAAAAAAAAAAAApIHt8QQAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAAAAAAAAAAAAAKSBjvsEAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBAAIFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAAAAAAAAAAAAAKSBnAMFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAM14fpGzBwAAswcAACkAAAAAAAAAAAAAAKSBeQUFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL3NyYy90cmFtcG9saW5lLmpzUEsBAh4DCgAAAAAAAAAAALz/AUOaAgAAmgIAABkAAAAAAAAAAAAAAKSBcw0FAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdVai6cEUAADBFAAAJQAAAAAAAAAAAAAApIFEEAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAAAAAAAAAAACkgUglBQBAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAAAAAAAAAAAAAKSBSTUFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAAAAAAAAAAAAAKSBMjcFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NyYzMyLmpzUEsBAh4DCgAAAAAAAAAAAJmqZKueKgAAnioAACUAAAAAAAAAAAAAAKSBpTsFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAAAAAAAAAAAApIGGZgUAQGVuZG8vemlwLXYxLjAuOS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAABkMoAslgYAAJYGAAAeAAAAAAAAAAAAAACkgYp9BQBAZW5kby96aXAtdjEuMC45L3NyYy9yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAAAAAAAAAAAApIFchAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvc2lnbmF0dXJlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAAAAAAAAAAAAAKSBVosFAEBlbmRvL3ppcC12MS4wLjkvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAKPreJANBwAADQcAAB4AAAAAAAAAAAAAAKSB6YwFAEBlbmRvL3ppcC12MS4wLjkvc3JjL3dyaXRlci5qc1BLBQYAAAAAWQBZABQeAAAylAUAAAA=","endoZipBase64Sha512":"0a99b0ddf5fb937e31f4a9aa7896f077f4ee8c2fcd57f2a228299acf3655f3987cc40451227164d05519c671bd79ad8287ece1644cac771e11be9e21a4b4039c"};
|