@agoric/inter-protocol 0.13.2-dev-8e71c07.0 → 0.13.2-dev-d8d8d74.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.
@@ -1 +1 @@
1
- export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAlrToWHagAAB2oAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdWx0RmFjdG9yeS9saXF1aWRhdGVNaW5pbXVtLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyMjI2ZGYxOWEwYzViYWEzNGU1NzQ5ZGEwMDllYjI3ZTZiYzEyMTFiNWZhMzY3YjBhYWM4N2Y3M2QzMWJhODdjYWMwMDM5NjM0ZjA2MjNjMjliMGIzZDcyYWU2MWQ5NjBjMzllM2ZjMzQ3ZWY3ZmFhODAzZDVmYTc4OGU0N2IxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MmQ4N2ZiMDNhYjc4MTY0YzM0MWZhYTJmNmZjYjZlZTg3M2ZlY2RmMmM3MDA0MjQ4YjM5MzU3MDYxMDJjOWM2ODZjMTJmNTQyYjQyMDdhNzk1OThkMmUyMDVlZjVkYzJiN2YwZjRkZDVmYzBjYmFhMDBmZTdhNDNmNWQwYWU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhOGQwMjk4NjFjNWUzYWZiYjc2MTJmZjU5NmVhYmIzYmYxZDQxMmJmNTFmYzZhNTQwNzljODRlMDc3NDY5MjlhZWRjZjk1NjliODU0YTY0NWZiOGViMTliNjM3MjllMjU0NjVmYzQwNmZhYzM2MDgwZjhjZWFmMzNlNWY1YWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1YmU5MDUzZDM1MWJmZWEzYWUzNDJmZDUyMmUzNzVhNzY1OGQ1OGVkMWU4NjFjNDJhNThjMzRmOWMwYmE0MGE3MzQxNmVjMDZlZTQxNGViYWY4M2EzZGRhMjZjZDg1YTFiYjYxODMyNTNmZjgwYjU1YjRkODEzZmJjNTA5NDcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViZWE3NGFlZjAwODNlNWUyM2RmMTJkOTIzZDgxZmRmYmYxYmRmOGRkNjFmOGUzMmFjODU4YWJjZTM4MWYyMzNkMWM1NGQ5ZTZiMTcxNGEyOWJjYmE5NjE5ZDQ4YmI5YTYwNzE4ZWNmNjBlMDg1MWFhMjEzMjUzNmEwMjNiY2FjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2JjZjIwY2VhZGIzNTg4MzMxNWMzN2JjNjdhN2FiMDQwZDk3NmY0ZjY3YTExMDYxNTE5YzYzMjFiYzhmN2EzZGQ0YTMxOTNlNjA5MDJmNjIwMmYxNzFlZDk2YTc2NTk5NGJmNDZhMjdhZDQxNWM0NmQ3YjI1ZDkzNGI1MDIzZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YTE1MmQ3MzA0OGYxNDJhMWU5OGE5YjQwM2EyOTgyYTQ2MmRjYWJkMjY4NmY3MWVmZTQ4ZjkwYzdhMTc3NTYwOTdjMTk1MTkxMjMyZTM3NzA5Y2E2N2IyN2RlZDk4ZDhiNzI1OWEyZWFmYzg0NTkwYzgzZmI4Y2Q4NjE1NzJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZmMGE4MGFjMzNhN2NhM2RjNDVmNTZhNjM4ODMyYjQzNTM3OGZiZDEyZDY1NjY2NGNkZjE3OTQzNTZiNzAxY2I0MzEwNjdiYmI1NDNkZjNlNDhiMjMwMzNiMWU0MTQyNjdhYTJmYmNlNTBhMGMyMDJiOWY2NmMzZmRiM2VkODliIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjYzQ1OTU5NDUxMTNiMGI1YTFiYjA3NDA3YmVhMmNlNjVhMDZlYjZiYWQ0M2U3OTYyODFiMmVjZWI5M2U1MjJjOTUxNjEzNTUxOGU0NjRhM2YwMDA2YWY3MDE1ZDNkODZjY2M5NGIyZWFmN2QxYTUyNzJiNmRkY2VhZTEyODY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MTk2ZDc3ZWJkNDAzNTI2YzRkYTg1MzZlZWVjMzZhMTEwYTMwNDM4YTAxOTgyMTkxZDdlZjE2NDc2N2FlZDc5YzZjOGM1ZGJkNjNmN2Q3Mzg0OTk1ZjlmZmMwNmFlODNiYmQxODc3YWM0YjVjMWY3MDNjMjE1NzEzMjEwYmQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNmQxZDYzNGE1NmY5N2FkM2QxMDNhNDg3ZTdkOTg5MWU2YTkyYmMwNmViZGZkZTU1MTIxYjY3MDdlMGM5MDlkZDVhZTY4YjUzYmFlMzQwOTEyZTZkYzdjOGI1YzYwMTBkNjcxOTBmODgzMzQyOTA2YThhMDllNjU5ZTM0MzI0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTEwNjIxNGNmYmM3YTAyZTllYjM2ODk0YzZlYTg0NDEzYmIwYmNiZDYyMGM1MjdhMWQ3YWQ2MjFlZjQ3YWI3NzUzN2VjNzM0ZDI5MDc0M2MyOGZlZGRjMmFkNzk1MjBhMjA2Yjg4NzY2MzE3YTY0ZjhlMTViYzBiNGFjMjgxODQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjkyNmE1YWMwNzY1MjJiODIxZDhjZDY5MTg4MmFiNDdlNTkyYTJjYzRmZjZhZGU1N2I1MGVjNmY3ZTNhOTgwZmU1YWJiNWUxNDU1NDJjODQyNTMxZWM5YTYzMjM2NDk3YWYzY2ZlMDQxMzliOTAyMDNjZWZjZWE1MjUwOGNmOGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzhlOWNmNmQxOTAxM2RjNDRhOTczODdmOTY0NzNiMGVlZjRjMzczM2ZkODU5MmMzZTA3NmNiNWZkZjZjMGFlZDgxMWVkM2ZmYzhjNzMxNDBmNzEyM2Q1Y2NiZTI0NWRjYTJjMTc1NTdhM2FiOWZkYTU1MDA0YmIwZWE0YTI4YjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwZmUwMzEyZjJlMGYwNTg2YWIwMTk4OGQwZThkNWQ3YzEzMWEzZDA3YWNiZWMxODBjY2JiODc5ZDVlZjRiMDcxZDZkODEwMmVkYTE1ZTNiNmY2ZGY1Mzk1NTFmZmNjMjIwMDcwMjkzNDgyZGY1MTU4MzE5MzZiZmQyYzFjZjhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjIwNmZjNmRkY2UxMDM2YzVlYTY1MTZhZDIxZTkyZTNmZmU3MWFiNTVmODdjY2IyNjRkZGVjM2U0ZDA1MjVhMWViMjkzYzM3YWQxN2M5MmZjNzdlMTAyOTQ4NzBiOWQ1OTIyNGY4MGQzYzM2ZTg5Y2IzMGJlNjFmOWQwYzg3YyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kaXN0L25hdC5lc20uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVHJhY2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVHJhY2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg4MmQxOGRiODgxMzNkYzc0ZDNkMTMxMzk1ZWU2N2JiYzkzMjk0YWQ4N2M5YjU5MTBiMWVkZGE0NGMxMTg2MWVlOTkyMjQ4NWYzNTU1ZGI0M2VmZmMxYjcwZjE3MDg5ZDk5MGJkMjNiMmJjZmE0NzM5YzgwZThiOWI3Nzg0ZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF1bHRGYWN0b3J5L2xpcXVpZGF0ZU1pbmltdW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdWx0RmFjdG9yeS9saXF1aWRhdGVNaW5pbXVtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWVjYjhlYWVjMDkwMWYxNzdhY2JhYzVhZjYyN2RkNDI0NWU1ODZiNjM5OTQ4NjI0YzAyZGY5MjM2M2EyYjdjOTkzMWMxYzgyODk4YTE0YWQ2ZWNmM2EwMTk2MmUyZTFkZTU1ZDBjNWUxZDUwYmE1ZWRmMDQyYjUwNmQwMWQzNjgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWUyNzBmMzUwYzA3OWNlODZmYjY4MzQ5ODJhNmE1YjRlMTkyMzEyMTk4MWYwMWVmNWYyNTQzMzA2ZTRlYmNmZjIxMTQzZTMyOTViOWM4ODEwMGE0Njk4YWI0YzA3MTgxMWMwNjZkZDAxMDEyMTE5YzAyMTQyZjNlOTgxOGI0MzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTU4NDQ4MWY5OGM2MTM4ZDBkYzJlOWRmNDJlZjcxOTE4Y2U0ODgzMzc0MTA1YzM5NWVkNjYzYzMwZDljMzk4NzUzZDA5YmJiMjE5YmUwOTlmYTFhYWEwMDk1MGU5MDE4OTM3ZDBjNDZiZDhiZDg5MjQxNTFkYWE0NDE4MTVjZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDQ5YjI5Y2IwMjE4ZGY2OTA5ZGQ0MDFkZmE4Y2Y0ZTVhYWM0MTdmMTVmOTkzMTk0NjJiNzgzMGM3YmE5NWU1ODQxMzA5ZDY3MDMwZWM1YTI5MWNlZGE5ZWFjNDI3ZjBlNDgxZjY0ZTUxZGE4ZWZkZGI1MDU3Mjg5M2M0MTE5NTkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbmF0LXY0LjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9uYXQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZGlzdC9uYXQuZXNtLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImRpc3QvbmF0LmVzbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYyY2U0ZmI2MTdlNTQ4YTI0YmU0MDc0MjQxYTQzZmQ5ZDIzZjU3OTkxNDAxMzI3NGUwNjYwNzk3NGRiOGFjMDEwMmI5Mzc4MDgyMWJiZjZkNDk0Yzk1YWRjNTRjYTIxNDdiMTI1ODVhZDg5NjJiMzA0OWY0MjhjMWQ5OWEyMDJlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWU4YWFmZGIyNDNjNzkxZDBkZTE5ZDQwOGI4ZWY0ZmM5ODBkMGEyMDliMThhN2NmM2JiNDE4N2Y4Y2Y4ODdmZjNlN2FmNzFiMjM4YWFkYjYxNTQ3MGYxNmZiOTY1ZTkyNTMwMjIzNWM1ZDE5NzBhYTA1Njk3N2Y3NGI0NzI1MDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODYzN2RlZTQyMmZlYTc3ZjdkM2VlNTdmNWU0YTE1OGUxMWE5ODU3YTI5MDEzNGFkM2I2ZGFjZWExNDdiNzQxZGZjMTQ5MDhlYWI0YWIyODY2MDg0MTJlZmY3MDA1ZTJhZmFjZjY4YmM2Y2ViOTA2N2I2ODk1MjI1NGMxZDI5YmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQ4ODBmYmZiYjExOTcwYjlhMzUxNzQ0YmQ1ZjRjNzY3MTJkM2ZmZTk4YjQzOTU1MTdhNzI5ZjFiOTQwYTg5ZWUyYjM1MmU3MmRkYjA5ZjQ1OTZmMDU1YzdhYWJmOTk2OTg4N2Q0OWMxZmNjZmRmNzg5OGY1ZTRhYjhkNjdkZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODRjNWM4Zjg2ZTA0MjI3MDVmMThlY2QwMjU2MWViNjFiY2YwY2I0MzkwY2E4Y2E0OGRiNzcwMjRkNmRlOGY1OTY5OGU1Yzk3ZjQ1MmQ3M2NmYjNkYTFmMWU2M2FlNjk0YWU3ZmI3ZDM5YTdhMTE4MmNiNzQ4MDczOGJmMzdjMzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmY4ZjlhMDI2ODczMzRmOTExOTJmNzE3Mjg4MjYxYTIwMjZkYzA4ZmVjMGMzMWYwN2JjM2NjOTliNDJlN2E4MjVmZjVjNzFiNmJhMzI0NjRkMjVhMDEyMmZjOTRiZDBlODlkYzFhMTY4NDQwMDlmNGYwZDk3NmU3NTE1OWJmMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3Vic2NyaWJlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNlZWEyOTk0YWFhMzU4ZTFlYmYyM2NlNjA2NzBhMjg0MGY5MzBhNDU1YzYyMjgxYjZmNjljZDUyNWUwMWNhNzg3N2VmYjE5NDJmNmMxNjBmMzg5NTA5MTIyMGMzYzVjYTkzOGM4NTU5ZDMxM2U1Y2E4YWY0Mjk2YjRmMjQyNmUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNGI2ZGIzNGM2OTlhNTNhYjQ2MDRlZmM1MmU2MjdmYzE4YmRjZjFhZDc4MzQ1ZTI5ZDVkNmQ5NmM0MDI5OTIwYTQxNjA4NGNjZDM1NWE5ZWVhNzIxNGE3YTAzZjU3MmRhY2M5MWY2NzllZTkwZGU1YjFlNzlkZjliMGUwMmU3YiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC44LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3NyYy9oZWxwZXJzL2Vycm9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaGVscGVycy9lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI5ZmUzNTMwNWY4MDdkYTIzNWYwNjg4ZDNiNjVlMzUxMDM4ZGZiNTc0MGNmNzI4MWMyMGM0NTM4MjVmODNhMDY2Nzc2OTZkM2JlMmMwMTg0YmYyZDI1MDgxYTA4YjkyOTBkZWVjNjlhMzlmODg2MjkwMDE3Y2M4MmJiMDRjNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmUzZDMzNDIwNDc4OTBjOWFmZjk2MGNkOTY0MWFkNWEyMDBmZGE1NDZkNzlhYzM3ZTgxYjhlNmI0NGVlM2VjNGJjMWFlOTE1OTA4ODllNTNmYjliNGIxZTVjM2ExNWIxMGE4MzFlNGQ4Njc2ZmY0YmNkZTg1MDlkYTBiY2Q1NzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjOGNmZTU4Y2U5N2JhNjVhZDBmOGJkN2IwN2MxNzFkNDU3MDIzZGJkNjA1MzIxMjU1ZWZmZGI0N2JjNWQwMDFlMTdkMTYxMWJjNzM5ZmVmYWE2NjE0YjUwMDU0YmQ5ODE5Yjc3ZDI3NzgyMDY0MWIyZTcxNjZlN2Q1MWViODY3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNjBkOTlkYzU1NDIzZGQ3ZmM0Yzk1ZTNhN2I2MWMyYjFkZjIzODAxN2QwOTQ0NDc4M2NmZTUwMjk3MWY1NzE4N2RiYjkwMTAxM2U1NTA5MWUxYTMwZWY3N2YyMGJiMWZlZjA0Y2JkOTJmZWIyZDNmNjJkMjM4YmEyNTk1NTRjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyYTRmNmIxZDRhMjhkZmRiZjA5OWFhYTZlMjJjMGIyNzNlMTFjMDA0MzI3YjNmMTEyZDgyOTc3MDc2YzdlZDBjZjQ3ZGYwMTRlZTUwMjM1M2E2NWU2ODI1NGYzOGJiMWVhNTI0ZGRmNjNmZDQ1NTBjMGNmNDk3YzI2ZGQyYzE5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGE4MWI4ZDE2N2E5ZDhlYWI5ZDFjOTQ3OTRjZTA1MTE5MjdlODdiOWQ2MmNkMTBlMGE5OTdjZWY4M2IzNzI4MDM4MTk0NmY0MzBjNzgyZTE4NjI0ZGI3ZmRiMTRmZWYwNTAwNzYwN2U2ZDkxMzczM2MwZmU2NzI1MGJjZDg3NzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YmJmOTc0MmNlZjQ1NzVmNTFmZTI0ODBhNTllNDVjNjI5MzE2ODA5YTg3N2RlMzBkYzViMzViMTBmMTA1NWI2MWIxNDVjMzYyZTZiODQxMmNlZWRhYjE1Mjg5MjgzZjA3YWE2ZmNkODk2NWUyYmIwZGZmOWE0ZjBjMTk2MWRkNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1M2I4ODU4NzQyYzQyZTY0ODNjNGZhZTdlOTQ3ZjdhZmRiMWVkZjZiNDAwZTgyMTVmY2ExZDQ3MWY0MWZkMzJlOWI0OWNhN2IxMTRmZTk5ZGQxZDU2YjY5NGIyOGZkMGQ5ODkxNjNjMjI3ZmQ3OWVmMzBhY2UzMDhiYTUzNzAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOGRiYWJhMWE4YTYzYWMwZjAwMTRjMWI0OGY1NmNkMzQyMTZhZjMzNGMzZmU4MjgzZjYzMzhjOWE2N2ZlZjQ4NDI4MDlkOTAxMzI2YTllYWYwNWFkNjg0ZjRhNGIwMzdiNTNlM2E5MGY4YmIwYThiZGQ1ODcyMmIwZjAxMDNiNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NGZhMTA1NjkyNzdjZjY3MzM5MDdmZGIyNDVlOWJlZjIyYThmZTdlNzljYTA1YmVkZjdkNThiOWVjNTUyNmMzOGMxYTkwZTNkODJhZGJlYmRjYzk1MTFkZjk4MzRjMTMwZGVmY2QzZGQ5ZDIwZjE0MmEwNjZiMGYyM2U4ZWNiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzY2ZkYmUyODBmZjRkNWFlMzMzOWIyZDk5ODY2OGI2Nzc0MTYyNTgxNDY3ZGM5YTVjNGNiYWMwYjUyNDI3ZTQ5YmMzMzRlOWNjYTQzOTJkODMzMWYxZmQ0MjAwZDgzNGMzMWMwNTJlNWU3ZGU4YTNmOWYwNjBjMmZiYjc0MDhjNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1ODZmZjUwZTExMjkzOTNjMzNmMWUzYWE5YTA4NTU0N2E5YjhhYmMxYWE0YWJhM2IxNzlkZTY1MzJmZDhhMTQwMDBmYzQwMmJlY2Y1YTNjNjhiYTc3NTM0YTdlNzJlNDYxOWI1YTkzNTk3NTgwN2UzNTM4ZmFkOWVkMjc0YTZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzNWQyNjg1YTFjZjYwOWJlZTU5MDNiMjIxNmFlZTM3YzgwN2ZlNGUxYWNjNTI5ZmZlZWM1ZjI1Mjk2Mjg0ZjJkZWY1NjYxNmRlNzM2YmIyZDU0YjFmNjUzMTZmYjdjNTlkMmJjOTg2NmFjMmI1NjMzYmUwMmFhMzdlMjkzM2QyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWM0OTBhNjkzNjIxMDBiMDIzZWQxY2U1NDgwZGViODM0YTk0Mzg1N2RiODVlNzJhYzExN2MzMWM5MTc0ZDI5YWFlYzFiZDkwYTczMjA3NjM4OWM2ZjgwMDg0NGRhM2RlYzBkOGRiZmYyY2M4MTAxNzFmOWM5NTcxZGVjY2EwYzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0M2RmZGQwMmI0ZGQyYmVmMTVlOTdiZTc2Y2RiZTJlYzg3YTM3MzZkZGQ0M2Y3NTcyOTVmM2U3ZDBkYTViYmJkYWQyMDIwYTc5ZjRjOTAwMTIxYmFkOWNiNTlmY2VkN2EzNmMyNTNlZTcxZTkwYjE4MzMwYzMwYjYxNjMxYWViZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYjczN2ZkY2M5ZGQzMGI1NjIyMjY4ZGQyY2QwNTQ1NDkxMWFiZWQwNThhOGFmNGRjNTFjNGZhNTQzYTI3YzI1Yzg1MDEyMGM2ZWZlNjVlNDFhYzc1MWM1ODU0ZWQ4ZjE3OGQ5M2IyNjRkYmM5NTdlMmI2ZTEwOTNmMWExZWE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWU4NjUxZTFlY2NkMmJiNzE5MTQ0MzUxZTQ0ODBlYzVmZjc1YTdmODIwNDE2YTFkNDdkZjM1YzMxYjNlNWE1MGZmYjIwNGE0MTk5Y2VjYjU2ZDkxMGM3ZWU5OTMyNzU1NjYwMTUyZjE1OGE0YTBmYmNiNzc5NmJjYmQ5ZjM3ODgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzNjYzNWI4MGIxMmY5MmQ3MDMyZDEzZTk2MzJiYTkxMDEzYzMwOWQ3ZDc3NjYyOTY4NWY2OTkyYzc5NWI5YmY2NjVmYTY2ZjU0YTA2YTUxMzIxN2UyMGNlMzhlZjQzNTNkZTk5ZjI3YzNhYjdhMTM3MzM3MmU0NWNkOGJlZGRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNmEzZDViZThhZTcxOTVjZTM5NzZjMDgzNTlmZGE2ZDE3ZjExMjM3ZjllOTQxZGZlNTZlY2ZiZWViOWMxNWJiNWUwYzkzM2FhNjk2ZDVkMjJkNDY5MzcwMmZhZmY5NTkxNGI0ZmUyY2IzZTZkMTY4ZTM5ODE4ZDVmYTY2Y2MzMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5NmExMTE1ZDMyMjQ4NTQyOWY4OGM2ZDUwMjEzYWY0ODA0YTE4NmU4MjM0MWJjY2QwN2NhYTNhNWUzMGRhZjE1MDYwMjM4NzVmMzFiZmJiZTZhZTg5MmE1YzJjYTdiYTA5NjY0NGNkM2MzMzkyMmQ3OWNlNDExMTJiNGVkODBjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1Y2NiMTAxZjBjODRjZmY0MDI0NjY2YWY0ZjcyNzQ2YmQ5Mjc4MWE0N2Y4MTllNzVhMTM0ZGZhN2M2YjZhMTJmMDEyNjYwNGQ4YWY3OWQ2NWNmYTgxZmU0MzZhNjQ4NWQ1MDc2NDg5ZDAxYWU1MmFiZWZiZTg0MTlhZjNlNjgzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zhci1jbGFzcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZmFyLWNsYXNzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTBlYmU5Mjk4MjdjMmMxNzJmMzc3NmQ1MzBmMDdhYmY3YWJlMzFiYmMwNmY3ZDVkYTgxMWJlNDZkOWM5NzI2MWUzMjM1OTZlMDFkYzkzY2MzNjljNzI1ZjJjOGYxZjgwMmRiYzc4NTg0NjYxYjY2YzAyMWY4YzQ0MTRmODI3MDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjA0Y2M0MTY5NWY3ZDJkMmRlMWFlNjkzYTUzYzg5OTRlNTFlYTFhMWEyM2U4ZjhiMTIwMWM3NDUwOWM1ODI1YjQ0MzM0ZjI1Y2E5N2IwNDg5YjczODNlNDI2ZmQzYjdhZTQ4NWYyY2ExYjRjMTQzM2IxNWI3YWQ0MzZlNjY3ZTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2luZC11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2luZC11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAwNTlhYTVhNDc1ODhkMDBlNWQ4NTAzODQyN2Q5Mzg2OGMzODY4YTJmMmM2MDUwY2RhOGFkODgzZDM0NTY0OTg3NzZmNDRlNDBjYmI2ZWJkMjYxOTM2MTJmZDZhZDc4NzliODEyMDAxZTNlNTMyMzVlYWM2ZjU2MmI1NjVkZTZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhNjAyYTlhMmQ5MjdiZjE4NWI3YzkzZjQ2NWIxN2MzOTU0NWY1OTI4MGU1NThiMGQ0ZWMzMWVjNGNiNmVhNDEwMDUxNzlhOWY1ODY4OTk3NWE0MzlmOTE5ZTQzNTYwMmJhNTA1Mjg4NWMzNmVhNWUyOThlNzAzNTg0ZDBhZGU2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNS4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjEzLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2M2U3MTJhODlkNTViOGZjNTc4M2JiNmY1YTRlMzI5NzdmYzNhMjBkMmJhODIxMjhlZDdlM2FkYTllNjNhY2ZlMDYyOTUyZTFlODk0N2VlZWU2NDUzOGRjMTAxZTRiZTgyMjc5OGFlNTZhMjZhYzllZDM5NDBmMjYyODhhYzBjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5YmE0MzlhY2Y3OTgzNGVmZmI3ZGYwZGI0ODNiYzA4YTNiYmVmMzZkYTI4OGMxZWY1MmRhMzE1OWFjZDAyYmVmYTE4OWYxZjA5NjA5NzYxYjVkM2Q3OWY3OGE5YmE3NzJiMGQ5NWUxYTE4MmJjMTFiNGUwMzUwMGIwMjI5MmIyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2MxNmQzODAyOWM0MDgwMWRiMDBiNDc4ZDkyOGI4MjMwNjk0M2M5ZDExOWFlZDE4NzcwM2U3OTIwZTFlMWFmMDU5MzAxNjNmMDRkY2E0MzI4MTM1NTRlOTZiOGFlYzc3NjViNTBlZTc2NTJjNmY1ZTBkM2MxZWY4NDlkMWM4MDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMjU2NzJhMGVhMzc5MzE1YWE5YmMyNDk1NmYwNDYwYWQ4MDMxZGY0OTUxZGZlNzQwZGQ0YzM0MjBhZjAwNzgwY2FlODlkNGM0YjZkN2EyZmM3ZTRjMzU1MDE0Y2FjYTIyMjIzOTIzYTc0MzEyNGNmOTcwZGI5MTE4MWJlOTc2ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzY2M4NjIzYTI4NTkzYWZiMjFjZjViMWNmNDBjNTYxYzIxZjgxMTViMDhlZjgzZGYwYmE2YTIzZTU2MmU0ZTA3OWRmNWMxYTAxOWE5M2EzM2M2NzIwOGYxOGU4Y2RiNWIzZjVhOTUwOTU0Yzk0ZWUxYTE2MDNjOGYyZjAxOWU0MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkwODE5OGQ5YzZkOTk0OTRkOGY0YWU2OWQ5MmE0ZjM2MzQ5YTBhZmZiNGM1NjY5ZTg0ZmM1NDhjMzc0OGJjYWQyNzg0ODBhZDA4MDdmMzM3YzNiOWE1NGM5NDYzMWFmZTAyZDAwNGUxNzUyM2VkZTBiMTRmNGJhZGFmMTkwMmRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zYWZlTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTAxYjgwMDAxZjVmNTU2MjJmN2M0MmQxMThmYTE3MDk0MmIxMTQxYzNjZTkwYzZkMjA3NzQ1ODk3NzY3OWEzZDUyZWI0MjNjMmFiODZkNmI2MzQ2YzM0OTk2MzU3ZGVjMDdmZjU0ZWI3NDJmODExYzk5MjVkMWEyN2VjODEwODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzMTFiOThkZWY0M2U2ZGRmMTRhY2ZiYWJjMGMxZjY4YjhmNmI4NTgxZmUyMTE5ZjlmOTE3MmE5MDA4OGVhYzk2YmJjMGU5ZGZiYjE1N2I3NDQ3MDEwYTgzZjRlOGNmZjYzOWE4MjdiOTRlMjBjNWQxYTlhOGZiZDJkNjQxZTBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiNDk2YzYzMTcxOGQ4NmQ3ODRhYjBkMjVmN2JmZmEwNTc3ZjU2YTc3N2IzNDcxNGRiMTgyMzA0YTk5ODQ3YzU4MDBkN2FhZDBjNWI5YmU0NzA3MGI2NWI2ZjkyZjNiYmNmNGMyYTA5NzkwYmYzYjhhOTY0NWUwMzMzNDJkNGEzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDEyZjk0YTAwMmYxMGM4YWVjYzVlYmZhYmM1YjIxMWFmYTdkNjVmNTBjMmFjYWQ2ODQyMmRhYzExZDllZDI4ODBjM2RlY2EzMDQyZDQyYzM1Y2JmODM2ZGFjNDY0NzdlNGU5N2RlOTg1ZjA2NGYyY2E4MjIwYmFlOWQ3YzVmMTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGI2NmE5NWFhNTNkMjkyNWJlOTNiZTA4MDhhN2E0NGJhNTc1YzY5ODc5NGM3ZGI4YjRhY2M0MDllMzEzOWJjODg5ZjYyNGUzMzQ1NWExNGZlYTM5ZjA5NDg3NWQ3MjZhZTM4ODc0YzMxOWZlNDA3MDQ2OTJjM2NjNTM1ZTZmYzUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY1NWZjODk5MzQzNjFiZGYyNTJhMTA0Y2Q2ZmI0ZmE3YmE5NGVkMjdlOTEyZGFiZTRiZmUyN2FmYzQwNjIxNTQ1NzExNjk3N2Q2ODY5ODdkMDYyMWI1NzhlZDExZjgwMTFiYTYyM2U4N2UwMDEwYmUxMWZiYWFiZDE1YWU0ZDM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YzY4NTNiYTFlNTQ2ZWZlYzg1YjJmNjhjOTM1OGQxNzQ3OWFjYWM5M2ZkYTllZTA0NGUyZmU4MDA2MDdlMWE2YjYzMzMwNmM1OTdmOTI5ZmRhYzhmNTRhY2RmZTY0YWJkYjUxYjUzMDQ0ZDJkMDhiYWQ5MGEyZGQ2ZWExNzgwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MjJhYjA3NGY1MTYwM2FiZDA2ZTNiMTk2ZmVhYjFjYzE4MjZiMWEyNjM3OGQwMjViYmIzZGQyNWFlNjY0NDMwOTE1NTM4ZjBhNThhZjZiZDI5N2Y1MWJiMWYzZTBhNjJjMzcwN2FkZTMzN2I5ZmI2YmZkOGE4ZmEzMDg0YTFkNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWNlZjM2YTIxNzE1MDA4YWJhNWU5Mjk2NTNmMjcyMDhjNjZiYjc5OGY0MGNiNmQzMzJkZmU0MzlkZGFjYWRjNTYyMmQ1YzAwOGY3NjU3MjQyMTcxMjA5NjdjYmU5MjQ4MGZmMzU2NmYxZDkyYzIxZGI4Y2E2ZjhlMGY5ZGYyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzOGEwMmJkZGY2ZWRhNWY4OWRjMTc5MjQ5M2JlZjMwNWQwYzg2OTlmYTVjZDFhNWQ0ZWZkOTgzNmZjNGU5ZjVlYjJkZGQ4NmYxM2NjMWI0NjcxNDQyM2U4ZjhhNTlkYTJlMDAzZDM4MmU1ZTg1YTBiNzM3OWY3YWMxYjNjMGI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODIzY2U5ZjYwMTFkMjUxMTRhZmZkZGM3ZmNjYzI5NzdlYmMxNTM0NzA3MGY2MjNlZGNlNTY0NzM2NDdjYjA5NGZjYjE3ZGI4MzBlNjk0ODNhNjE3ZjFmM2JhN2RjMWEzZDk1OGM5OThhMTcyYjY4MDExYzYzNGRiMjFlY2E1YTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWI4NWRiZTRjZDU5N2RiMjg1YWFkNTI0ZTIxNGNjOWE5MzY1MWRmM2Q4Nzg5MDBlY2NhNjk4N2M5MDFmNjg1MTg3ZWM1YTllMjYxZjg3YzYxMWVlYjdmYWJjODU1MzYzMjk1MzA2ZTliNTNmMWQ5N2Y0ZjZiMDJlNGJiZDMzZTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjJlZDM5MzhmMWVjMTgwOTYxZjk2MTFkODMzNDI2N2IyODlmOWY3YWMyMTdkYTU1NjE5MGU3NTdkODVlYzhjNWZiOTgxYzg1YzU1ZWQ2N2E2ODZiZjVmYTUyMDUzMDZhY2U1NzY5YTkyZThmN2FlZjE4ZjUxYTUwMDNjMTRkNGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjdiYmRlNjlhNjg1ODY2NzZhNTExMmY1NDJlNzk3ZjU4MDNkZmFkNTgyYTY2ZTBjZDYxNDU5ODg0OTU0MzkzOGYxYTg5MWI2OGU0NTk4MWQxMjIyMjg1NThhNmQwOWI2N2VhYWE0ZWYyYmMzMGJiMjhiNzgwZTgxYWY2MTI1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFmZmE4OGE2NjFiY2Q5MTc0OWMxYjRkZjVlYThmMmE3ZjhjNTM0OGI3ZDg0ZWFiMzNjNDA2ZDU2NjkyNmViOGNkNjVkNDYwZjIxMDg5ZmZlZmE5MzRjZDc0NTBhNzgzNjAyNzc0YWM3MGU2NTNhNDE1MTkxZDFiMzE2YTk1YmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQxMTFmMWI2YzE4OWU1MjBhY2UzNWVkOGUwYmJhNmFhNmQyMDdlZTg3ODFmNmE3Njk4ODEzZDU2MWM3ZWM5YWRmYTJjY2JmNGY4ZmE1MjE3NzVlZDJhMjEwYzQ0N2UwMTc0YjdhMzZlOGZmYmQwZjBlYzc3NzI3Y2RkMWM4MjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0ZTIwNjI2MzAyNzZmZWIzNTFkMWNkNDM3MzI0MzIwZWRkMDliOWUzYjI3N2I1Mjc4Nzc5ZTUxN2M5NWYwNjhmNmZjMzEzOGFhODI3OTA4MjBhOGZkMzg5OTA3NTNjNmUyZDJlNDQ2NTlkZDhlMjJlM2UzODEyYTU4YzczNGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjYjUzMmNiZTMyNmY4NmViNGNjZDM1Mjk5MTJiYWU1NTQ5MjI0OGE0NTU4OWE4MDcwNzJjNWMzODRiZjQ3NGM0ZDZlMTkwZGE0MzNmNTZiYmIyMGNhNjM2ZDYyNmI2YzBhY2E0NTc2NmRjYjJlMWQ2Nzk5ZWE5NDU5NTU4NjA5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhOTIzYzc4ODFkZTYwMTEwY2FhOTNlNmRmOWQwZDRmNzViZDUwZjkwYjM1YzgyM2JmM2ZhOGU1MTc3MDkyZTNjNzEyNzlmOTNkZGYyNTExNjYyZTQ5NjNiZWM3MmM0ZTk1OGE1MjI0YjJmNzY3ZDQxZTRjZGMxYzBiYjVkMTg2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjE3NzYxMmZkNzJlY2EwZTNlNWNjZTE4OTRjZDRiODQwYWRjMzQ0NTgwODk3Zjk3MDYyZDI3OGYwNTRjN2I3MzA0NWY1NDRiODM3ZDQ0YTM4YTc4NWE5ODIzZjU2MTdlYWEzMDg3ODJiOWMyYWZiMTgwZTMwZTAwNTk5MzNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1OTBmMzJkYTNlZjNjMzU2NjI0MDEyMGY1NjJmNTZmMDJhN2E0NWE3ZDJjOGZhMDFkNmYyNmE0MWE1NzFkNWQzYzU0ODEzMWYwOTExZGFiNmM1NWYzNTY3M2I2MmRhOTQ4MmQ0OTFkM2NjYzIwNDAwYWY2NmNhMmEyM2JmNmI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkMjlhNjhmZDJkNDk3MTc1NmRjYWQzNDdhYTViZjEyNGQyZDdmNGNmYmY3ZWI1NWMyM2M5NjQ5ODA0YWRjMjE4YWUzMDgwY2QxMjQwY2MzYWYxZjdmYzA0ZjVjMzA2MjI0MDZhNWMxYzFmMWY3MDg0ZDI3ZGQyZTU5OTZiZjUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGJlNmFhMjdhMGE2YjEyZDg2Njc4NTkxMDE4ZDEyZTljODgxYTc0ZmVkM2RkY2UxZTc3MzNlMjk5ODM1NjYwMDUyZGQ0MmQ5NmY2NWE0YmQ1NjZiMmExZmU4ZTJhZWY1ZWQ1M2ZiNDkwNTBiNzk5NDU5Yjc0NmQ0Njc1MjYwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNzNiYzExMDFhNWQxZTE4NjM4YzY5NGZlYTZlMDdlMTJmMDAxYzZiNDQ3YWQzMTBhNWYxMWQ2M2ZlNThiMTU5NDgzN2I5ZDQ5YTc4ZjNkMmFjM2M5OThlMDg0ZDk3ZTcwM2EzMmUwOWIyNjZkYzVjMjkyYzYyZGQzY2NlNWU0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NWQ2MzZhY2Y4OWUzYzBkMDg3Y2YxNTRiZDQzNDc2ZDk4NjBmZmM1MmQ3OWYxYzI5ZmQzYzg2ZWNiZTg2MGRmNmJjNjIyOGE0M2NhMzhhM2Q3NmQ5N2QxNTUwOTRhODk3Njk5Y2Q0ZjdhYTRkMmM1ZWIyZTIyYTY3ZTVkMmRhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzRjYTBlMWRhNWY0ZjgzZmJmY2Q1OWIzYjdhODhiZWRkNTk1OGNlYTZmNmMzYzgyN2U3NzQ5ZTFlMzFhOTE2MzA2Yzg4ZmM3MThlMmNkNDYwMjRiNGNlMTVmM2M3YTQxY2FjZmVmZGFhMDllMzQzZWYyOTJiYmE2NDkyMmQ1ODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTFmMGRmZDVlOTkzNzY2MmMyN2UxOTRhYzU5YTk4Y2VlMjJkNGQ5ODhkYWM1MThmOGI2YzY5YjYyMmFhMWY4NTYxNTZlYjc2ZTE0YmMzYzQzZmVhM2QwZDE4YjhiZTlhN2JkY2NlNzk0NjBkNThlOTM2MGQxNTYxOGJkMWQxZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1ODM5N2U4NmI0NjBjMGQ2MmQ3ODk4ZjljMzhhOTAzNDljMTJmYmI0NmQzY2ExMmQwZTgzZjg2YzM4ZTg2MDg5Njc4M2EyN2IzMzRhMzE0ODhlYzRkZmRjYjVjYjBkYWI0YzVhNTg5M2U0NDFjNzEwODhjMTliYTQ0MTczMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkNjc5Mjg3NTAwMWRlZGRhNTUxY2U5MjRlZjFhM2UyZDA2M2Q1Zjc3NmZjM2FkZjQ3NDJkMzM2MjJkNDUxYzU0NTUzNDY2ZWM4ZGY0MjhlMWU3M2JiMGQyNzQyMzIxNmU0MzlhYjE2ODUzNDk4M2E4OGU5MzhlOTRkOTFmMzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZmY5OGQ1MmVkZGYzOThjZjk2YWNiMTA1OWJlZDAyN2Y0ODZlNWJkZDcxYzA1NzZiMjhhZmEyMTE5ZGE2Yjg0MWMzODlkMDJiMzMxMDdkOGFiYTBhZWU0OTI1ZTYzZmI3YzM1OGE2YTQ1ZmE0YWMxYWU3NzY1ODAyMDU2YWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWZhYjE5Y2I5ZDczMjM3YmI2YzVmNTY4ZTU3ODY3NTFhN2FlZWY5NjYzZjJhMzBjNGI4ZjQ2NWUyMDEzOWYzZGEzNDZlYjJlNDEwMzg2ZjJkOTkyOWRmMzNjNTBmYThmMjQzNzMzZDc0ZjhiMGNmYzljOGI5ZjMxOGM0YWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlZGI2ZThhZjFjYzkxYzY2MzJhYjI2ZTU4NjkwOGM5N2NhNmYyNmM5N2VhZTEzNjZjMGYwNTc3OTc5MTEzYjE1YzViYTRiMzQzZDUxOWE5ZWQwNWRjZmMyMTA3OTAxNDhkN2E3YzY5ZDllNjYyNDQ2N2I2NTlkMGM2ZTI5MTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjODNhM2EzZTk2ZTZjNTlmMTllZWY1OWY3ZTQxN2RiNzViZjFlNmQxZGM3NmFhZGRkMmJlNDYzZTVmNGU0NzkyOWNjMWNiYjMzZjkxY2FiODZjMTc5NGY1Zjg0MDNiYzQ3ZTMzZTI2ZDExODYwM2M3ZDA1MjgxZjQ1MTdhNGFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAAe3aYBoLAAAaCwAAIwAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYWlsIiwiTm9uTnVsbGlzaCIsImFuIiwiYXNzZXJ0IiwiZGV0YWlscyIsImlkZW50Q2hlY2tlciIsIm1ha2VBc3NlcnQiLCJxIiwicXVvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhbiwgJ25hbWUnLCB7dmFsdWU6IFwiYW5cIn0pOyRo4oCNX29uY2UuYW4oYW4pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtBc3NlcnR9ICovXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7JGjigI1fb25jZS5nbG9iYWxBc3NlcnQoZ2xvYmFsQXNzZXJ0KTtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BhZ29yaWMvYXNzZXJ0J2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPVtcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4nLCAnKVxuIH1gKTtcblxuIH1cblxuY29uc3R7ZGV0YWlscyxGYWlsLHF1b3RlLG1ha2VBc3NlcnR9PWdsb2JhbEFzc2VydDskaOKAjV9vbmNlLmRldGFpbHMoZGV0YWlscyk7JGjigI1fb25jZS5GYWlsKEZhaWwpOyRo4oCNX29uY2UucXVvdGUocXVvdGUpOyRo4oCNX29uY2UubWFrZUFzc2VydChtYWtlQXNzZXJ0KTtcblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBOb25OdWxsaXNoPSh2YWwsb3B0RGV0YWlscz0gYHVuZXhwZWN0ZWQgJHtxdW90ZSh2YWwpfWApPT57XG5pZih2YWwhPW51bGwpe1xuLyogVGhpcyBgIT0gbnVsbGAgaWRpb20gY2hlY2tzIHRoYXQgYHZhbGAgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLiovXG5yZXR1cm4gdmFsO1xuIH1cbmFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xuIH07JGjigI1fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xuXG4vKipcbiAqIFByZXBlbmQgdGhlIGNvcnJlY3QgaW5kZWZpbml0ZSBhcnRpY2xlIG9udG8gYSBub3VuLCB0eXBpY2FsbHkgYSB0eXBlb2YgcmVzdWx0XG4gKiBlLmcuLCBcImFuIE9iamVjdFwiIHZzLiBcImEgTnVtYmVyXCJcbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbm91biB0byBwcmVwZW5kXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbm91biBwcmVwZW5kZWQgd2l0aCBhL2FuXG4gKi9cbmZ1bmN0aW9uIGFuKHN0cil7XG5zdHI9IGAke3N0cn1gO1xuaWYoc3RyLmxlbmd0aD49MSYmJ2FlaW91QUVJT1UnLmluY2x1ZGVzKHN0clswXSkpe1xucmV0dXJuIGBhbiAke3N0cn1gO1xuIH1cbnJldHVybiBgYSAke3N0cn1gO1xuIH1cbmZyZWV6ZShhbik7XG5cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRo4oCNX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnQiOlsiZ2xvYmFsQXNzZXJ0Il0sImRldGFpbHMiOlsiZGV0YWlscyJdLCJGYWlsIjpbIkZhaWwiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJtYWtlQXNzZXJ0IjpbIm1ha2VBc3NlcnQiXSwiYW4iOlsiYW4iXSwiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl0sImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4m9OmTgvAAA4LwAAIgAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogQmFzZWQgb24qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9TRVMtc2hpbS9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL3R5cGVzLmpzKi9cbi8qIENvb3JkaW5hdGUgZWRpdHMgdW50aWwgd2UgcmVmYWN0b3IgdG8gYXZvaWQgdGhpcyBkdXBsaWNhdGlvbiovXG4vKiBBdCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3NzQqL1xuLyogaXMgYSByZWNvcmQgb2YgYSBmYWlsZWQgYXR0ZW1wdCB0byByZW1vdmUgdGhpcyBkdXBsaWNhdGlvbi4qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCYXNlQXNzZXJ0XG4gKiBUaGUgYGFzc2VydGAgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSB7Kn0gZmxhZyBUaGUgdHJ1dGh5L2ZhbHN5IHZhbHVlXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZXJyb3JOYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0TWFrZUVycm9yXG4gKlxuICogVGhlIGBhc3NlcnQuZXJyb3JgIG1ldGhvZCwgcmVjb3JkaW5nIGRldGFpbHMgZm9yIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nLlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRGYWlsXG4gKlxuICogVGhlIGBhc3NlcnQuZmFpbGAgbWV0aG9kLlxuICpcbiAqIEZhaWwgYW4gYXNzZXJ0aW9uLCByZWNvcmRpbmcgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGgganVzdCB0eXBlIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIFR5cGUgYWxsIHRoZSBvdmVybG9hZHMgb2YgdGhlIGFzc2VydFR5cGVvZiBmdW5jdGlvbi4qL1xuLyogVGhlcmUgbWF5IGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCovXG4vKiB0aGVtcyB0aGUgYnJlYWtzIHdpdGggVHlwZXNjcmlwdCA0LjAuKi9cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJpZ2ludFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydiaWdpbnQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk51bWJlclxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydudW1iZXInfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3ltYm9sXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N5bWJvbCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnROb3RlXG4gKiBUaGUgYGFzc2VydC5ub3RlYCBtZXRob2QuXG4gKlxuICogQW5ub3RhdGUgdGhpcyBlcnJvciB3aXRoIHRoZXNlIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlLCBsaWtlIHRoZSBjYXVzYWwgY29uc29sZSBvZiBgY29uc29sZS5qc2AsIHRvXG4gKiBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBsb2dnZWQgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge0RldGFpbHN9IGRldGFpbHNOb3RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge3t9fSBEZXRhaWxzVG9rZW5cbiAqIEEgY2FsbCB0byB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgbWFrZXMgYW5kIHJldHVybnMgYSBmcmVzaCBkZXRhaWxzXG4gKiB0b2tlbiwgd2hpY2ggaXMgYSBmcm96ZW4gZW1wdHkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoYXRcbiAqIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIGV4cHJlc3Npb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgRGV0YWlsc1Rva2VufSBEZXRhaWxzXG4gKiBFaXRoZXIgYSBwbGFpbiBzdHJpbmcsIG9yIG1hZGUgYnkgdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIHRhZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0cmluZ2FibGVQYXlsb2FkXG4gKiBIb2xkcyB0aGUgcGF5bG9hZCBwYXNzZWQgdG8gcXVvdGUgc28gdGhhdCBpdHMgcHJpbnRlZCBmb3JtIGlzIHZpc2libGUuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gdG9TdHJpbmcgSG93IHRvIHByaW50IHRoZSBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBUbyBcImRlY2xhc3NpZnlcIiBhbmQgcXVvdGUgYSBzdWJzdGl0dXRpb24gdmFsdWUgdXNlZCBpbiBhXG4gKiBkZXRhaWxzYC4uLmAgdGVtcGxhdGUgbGl0ZXJhbCwgZW5jbG9zZSB0aGF0IHN1YnN0aXR1dGlvbiBleHByZXNzaW9uXG4gKiBpbiBhIGNhbGwgdG8gYHF1b3RlYC4gVGhpcyBzdGF0ZXMgdGhhdCB0aGUgYXJndW1lbnQgc2hvdWxkIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApLCBpbiB0aGUgZXJyb3IgbWVzc2FnZSBvZiB0aGUgdGhyb3duIGVycm9yLiBUaGVcbiAqIHBheWxvYWQgaXRzZWxmIGlzIHN0aWxsIHBhc3NlZCB1bnF1b3RlZCB0byB0aGUgY29uc29sZSBhcyBpdCB3b3VsZCBiZVxuICogd2l0aG91dCBgcXVvdGVgLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdGhlIGV4YW1wbGUgaW4gdGhlIGBkZXRhaWxzYCBjb21tZW50LCBzYXkgaW5zdGVhZCB0aGF0IHRoZVxuICogY29sb3IgdGhlIHNreSBpcyBzdXBwb3NlZCB0byBiZSBpcyBhbHNvIGNvbXB1dGVkLiBTYXkgdGhhdCB3ZSBzdGlsbCBkb24ndFxuICogd2FudCB0byByZXZlYWwgdGhlIHNreSdzIGFjdHVhbCBjb2xvciwgYnV0IHdlIGRvIHdhbnQgdGhlIHRocm93biBlcnJvcidzXG4gKiBtZXNzYWdlIHRvIHJldmVhbCB3aGF0IGNvbG9yIHRoZSBza3kgd2FzIHN1cHBvc2VkIHRvIGJlOlxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoY29sb3IpfWAsXG4gKiApO1xuICogYGBgXG4gKlxuICogVGhlIG5vcm1hbCBjb252ZW50aW9uIGlzIHRvIGxvY2FsbHkgcmVuYW1lIGBxdW90ZWAgdG8gYHFgIGFuZFxuICogYGRldGFpbHNgIHRvIGBYYFxuICogYGBganNcbiAqIGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcbiAqIGBgYFxuICogc28gdGhlIGFib3ZlIGV4YW1wbGUgd291bGQgdGhlbiBiZVxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgWGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UXVvdGVcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBXaGF0IHRvIGRlY2xhc3NpZnlcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gc3BhY2VzXG4gKiBAcmV0dXJucyB7U3RyaW5nYWJsZVBheWxvYWR9IFRoZSBkZWNsYXNzaWZpZWQgcGF5bG9hZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJhaXNlXG4gKlxuICogVG8gbWFrZSBhbiBgYXNzZXJ0YCB3aGljaCB0ZXJtaW5hdGVzIHNvbWUgbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb25cbiAqIGxpa2UgYSB0cmFuc2FjdGlvbiwgdmF0LCBvciBwcm9jZXNzLCBjYWxsIGBtYWtlQXNzZXJ0YCB3aXRoIGEgYFJhaXNlYFxuICogY2FsbGJhY2ssIHdoZXJlIHRoYXQgY2FsbGJhY2sgYWN0dWFsbHkgcGVyZm9ybXMgdGhhdCBsYXJnZXIgdGVybWluYXRpb24uXG4gKiBJZiBwb3NzaWJsZSwgdGhlIGNhbGxiYWNrIHNob3VsZCBhbHNvIHJlcG9ydCBpdHMgYHJlYXNvbmAgcGFyYW1ldGVyIGFzXG4gKiB0aGUgYWxsZWdlZCByZWFzb24gZm9yIHRoZSB0ZXJtaW5hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQXNzZXJ0XG4gKlxuICogTWFrZXMgYW5kIHJldHVybnMgYW4gYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHRoYXQgc2hhcmVzIHRoZSBib29ra2VlcGluZ1xuICogc3RhdGUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZSB3aXRoIG90aGVyIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdHMgbWFkZSBieVxuICogYG1ha2VBc3NlcnRgLiBUaGlzIHN0YXRlIGlzIHBlci1tb2R1bGUtaW5zdGFuY2UgYW5kIGlzIGV4cG9zZWQgYnkgdGhlXG4gKiBgbG9nZ2VkRXJyb3JIYW5kbGVyYCBhYm92ZS4gV2UgcmVmZXIgdG8gYGFzc2VydGAgYXMgYSBcImZ1bmN0aW9uIG9iamVjdFwiXG4gKiBiZWNhdXNlIGl0IGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgYSBmdW5jdGlvbiwgYnV0IGFsc28gaGFzIG1ldGhvZHMgdGhhdFxuICogY2FuIGJlIGNhbGxlZC5cbiAqXG4gKiBJZiBgb3B0UmFpc2VgIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuZWQgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHdpbGwgY2FsbFxuICogYG9wdFJhaXNlKHJlYXNvbilgIGJlZm9yZSB0aHJvd2luZyB0aGUgZXJyb3IuIFRoaXMgZW5hYmxlcyBgb3B0UmFpc2VgIHRvXG4gKiBlbmdhZ2UgaW4gZXZlbiBtb3JlIHZpb2xlbnQgdGVybWluYXRpb24gYmVoYXZpb3IsIGxpa2UgdGVybWluYXRpbmcgdGhlIHZhdCxcbiAqIHRoYXQgcHJldmVudHMgZXhlY3V0aW9uIGZyb20gcmVhY2hpbmcgdGhlIGZvbGxvd2luZyB0aHJvdy4gSG93ZXZlciwgaWZcbiAqIGBvcHRSYWlzZWAgcmV0dXJucyBub3JtYWxseSwgd2hpY2ggd291bGQgYmUgdW51c3VhbCwgdGhlIHRocm93IGZvbGxvd2luZ1xuICogYG9wdFJhaXNlKHJlYXNvbilgIHdvdWxkIHN0aWxsIGhhcHBlbi5cbiAqXG4gKiBAcGFyYW0ge1JhaXNlPX0gb3B0UmFpc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVucmVkYWN0ZWRcbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCB0aGUgcmVhbCBkZXRhaWxzIHRvXG4gKiB0aGUgY29uc29sZSBidXQgaW5jbHVkZSBvbmx5IHRoZSB0eXBlb2YgaW5mb3JtYXRpb24gaW4gdGhlIHRocm93biBlcnJvclxuICogdG8gcHJldmVudCByZXZlYWxpbmcgc2VjcmV0cyB1cCB0aGUgZXhjZXB0aW9uYWwgcGF0aC4gSW4gdGhlIGV4YW1wbGVcbiAqIGFib3ZlLCB0aGUgdGhyb3duIGVycm9yIG1heSByZXZlYWwgb25seSB0aGF0IGBza3kuY29sb3JgIGlzIGEgc3RyaW5nLFxuICogd2hlcmVhcyB0aGUgc2FtZSBkaWFnbm9zdGljIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgcmV2ZWFscyB0aGF0IHRoZVxuICogc2t5IHdhcyBncmVlbi5cbiAqXG4gKiBUaGUgYHJhd2AgbWVtYmVyIG9mIGEgYHRlbXBsYXRlYCBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYHN0cmluZ1tdYCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdGVtcGxhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IG5ldmVyfSBGYWlsVGFnXG4gKiBUaGUgYEZhaWxgIHRhbXBsYXRlIHRhZyBzdXBwb3J0cyByZXBsYWNpbmcgcGF0dGVybnMgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChjb25kLCBYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBvclxuICogYGBganNcbiAqIGNvbmQgfHwgYXNzZXJ0LmZhaWwoWGAuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICogd2l0aCBwYXR0ZXJucyBsaWtlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiBgYGBcbiAqXG4gKiBIb3dldmVyLCBkdWUgdG8gW3dlYWtuZXNzIGluIGN1cnJlbnRcbiAqIFR5cGVTY3JpcHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYpLCB0aGUgYHx8YFxuICogcGF0dGVybnMgYXJlIG5vdCBhcyBwb3dlcmZ1bCBhcyB0aGUgYGFzc2VydCguLi4pYCBjYWxsIGF0IGVuYWJsaW5nIHN0YXRpY1xuICogcmVhc29uaW5nLiBPZiB0aGUgYHx8YCwgYWdhaW4gZHVlIHRvIHdlYWtuZXNzZXMgaW4gY3VycmVudCBUeXBlU2NyaXB0LFxuICogdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmBcbiAqIGBgYFxuICogcGF0dGVybiBpcyBub3QgYXMgcG93ZXJmdWwgYXMgdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBhdCBlbmFibGluZyBzdGF0aWMgcmVzb25pbmcuIERlc3BpdGUgdGhlc2UgcHJvYmxlbXMsIHdlIGRvIG5vdCB3YW50IHRvXG4gKiByZXR1cm4gdG8gdGhlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmQsIFhgLi4uY29tcGxhaW50Li4uYClcbiAqIGBgYFxuICogc3R5bGUgYmVjYXVzZSBvZiB0aGUgc3Vic3RhbnRpYWwgb3ZlcmhlYWQgaW5cbiAqIGV2YWx1YXRpbmcgdGhlIGBYYCB0ZW1wbGF0ZSBpbiB0aGUgdHlwaWNhbCBgdHJ1ZWAgY2FzZSB3aGVyZSBpdCBpcyBub3RcbiAqIG5lZWRlZC4gQW5kIHdlIGRvIG5vdCB3YW50IHRvIHJldHVybiB0byB0aGVcbiAqIGBgYGpzXG4gKiBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApYFxuICogYGBgXG4gKiBiZWNhdXNlIG9mIHRoZSB2ZXJib3NpdHkgYW5kIGxvc3Mgb2YgcmVhZGFiaWxpdHkuIEluc3RlYWQsIHVudGlsL3VubGVzc1xuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiBpcyBmaXhlZCwgZm9yIHRob3NlXG4gKiBuZXctc3R5bGUgYXNzZXJ0aW9ucyB3aGVyZSB0aGlzIGxvc3Mgb2Ygc3RhdGljIHJlYXNvbmluZyBpcyBhIHByb2JsZW0sXG4gKiBpbnN0ZWFkIGV4cHJlc3MgdGhlIGFzc2VydGlvbiBhc1xuICogYGBganNcbiAqICAgaWYgKCFjb25kKSB7XG4gKiAgICAgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIG9yLCBpZiBuZWVkZWQsXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmQpIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZFxuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBUaGlzIGF2b2lkIHRoZSBUeXBlU2NyaXB0IGJ1Z3MgdGhhdCBjYXVzZSB0aGUgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nLFxuICogYnV0IHdpdGggbm8gbG9zcyBvZiBlZmZpY2llbmN5IGFuZCBsaXR0bGUgbG9zcyBvZiByZWFkYWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IGV4cHIgaXMgdHJ1dGh5LCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbHMgdG8gZGVzY3JpYmVcbiAqIHRoZSBhc3NlcnRpb24uIEl0IGlzIGEgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChleHByLCBkZXRhaWxzYC4uLi5gKTtgXG4gKiBgYGBcbiAqXG4gKiBUaGUgbGl0ZXJhbCBwb3J0aW9ucyBvZiB0aGUgdGVtcGxhdGUgYXJlIGFzc3VtZWQgbm9uLXNlbnNpdGl2ZSwgYXNcbiAqIGFyZSB0aGUgYHR5cGVvZmAgdHlwZXMgb2YgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIFRoZXNlIGFyZVxuICogYXNzZW1ibGVkIGludG8gdGhlIHRocm93biBlcnJvciBtZXNzYWdlLiBUaGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZVxuICogc3Vic3RpdHV0aW9uIHZhbHVlcyBhcmUgYXNzdW1lZCBzZW5zaXRpdmUsIHRvIGJlIHJldmVhbGVkIHRvXG4gKiB0aGUgY29uc29sZSBvbmx5LiBXZSBhc3N1bWUgb25seSB0aGUgdmlydHVhbCBwbGF0Zm9ybSdzIG93bmVyIGNhbiByZWFkXG4gKiB3aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUsIHdoZXJlIHRoZSBvd25lciBpcyBpbiBhIHByaXZpbGVnZWRcbiAqIHBvc2l0aW9uIG92ZXIgY29tcHV0YXRpb24gcnVubmluZyBvbiB0aGF0IHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHsgQmFzZUFzc2VydCAmIHtcbiAqICAgdHlwZW9mOiBBc3NlcnRUeXBlb2YsXG4gKiAgIGVycm9yOiBBc3NlcnRNYWtlRXJyb3IsXG4gKiAgIGZhaWw6IEFzc2VydEZhaWwsXG4gKiAgIGVxdWFsOiBBc3NlcnRFcXVhbCxcbiAqICAgc3RyaW5nOiBBc3NlcnRTdHJpbmcsXG4gKiAgIG5vdGU6IEFzc2VydE5vdGUsXG4gKiAgIGRldGFpbHM6IERldGFpbHNUYWcsXG4gKiAgIEZhaWw6IEZhaWxUYWcsXG4gKiAgIHF1b3RlOiBBc3NlcnRRdW90ZSxcbiAqICAgbWFrZUFzc2VydDogTWFrZUFzc2VydCxcbiAqIH0gfSBBc3NlcnRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZEh3gDjcAAA43AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBraW5kcyBvZiBhc3NldHMgd2Ugc3VwcG9ydC5cbiAqXG4gKiBAdHlwZSB7eyBOQVQ6ICduYXQnLCBTRVQ6ICdzZXQnLCBDT1BZX1NFVDogJ2NvcHlTZXQnLCBDT1BZX0JBRzogJ2NvcHlCYWcnIH19XG4gKi9cbmNvbnN0IEFzc2V0S2luZD1oYXJkZW4oe1xuTkFUOiduYXQnLFxuU0VUOidzZXQnLFxuQ09QWV9TRVQ6J2NvcHlTZXQnLFxuQ09QWV9CQUc6J2NvcHlCYWcnfSk7JGjigI1fb25jZS5Bc3NldEtpbmQoQXNzZXRLaW5kKTtcblxuY29uc3QgYXNzZXRLaW5kTmFtZXM9aGFyZGVuKE9iamVjdC52YWx1ZXMoQXNzZXRLaW5kKS5zb3J0KCkpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYWxsZWdlZEFLXG4gKi9cbmNvbnN0IGFzc2VydEFzc2V0S2luZD0oYWxsZWdlZEFLKT0+e1xuYXNzZXRLaW5kTmFtZXMuaW5jbHVkZXMoYWxsZWdlZEFLKXx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YCk7XG5cbiB9OyRo4oCNX29uY2UuYXNzZXJ0QXNzZXRLaW5kKGFzc2VydEFzc2V0S2luZCk7XG5oYXJkZW4oYXNzZXJ0QXNzZXRLaW5kKTtcblxuLyoqXG4gKiBBbW91bnRzIGRlc2NyaWJlIGRpZ2l0YWwgYXNzZXRzLiBGcm9tIGFuIGFtb3VudCwgeW91IGNhbiBsZWFybiB0aGVcbiAqIGJyYW5kIG9mIGRpZ2l0YWwgYXNzZXQgYXMgd2VsbCBhcyBcImhvdyBtdWNoXCIgb3IgXCJob3cgbWFueVwiLiBBbW91bnRzXG4gKiBoYXZlIHR3byBwYXJ0czogYSBicmFuZCAobG9vc2VseSBzcGVha2luZywgdGhlIHR5cGUgb2YgZGlnaXRhbFxuICogYXNzZXQpIGFuZCB0aGUgdmFsdWUgKHRoZSBhbnN3ZXIgdG8gXCJob3cgbXVjaFwiKS4gRm9yIGV4YW1wbGUsIGluXG4gKiB0aGUgcGhyYXNlIFwiNSBidWNrc1wiLCBcImJ1Y2tzXCIgdGFrZXMgdGhlIHJvbGUgb2YgdGhlIGJyYW5kIGFuZCB0aGVcbiAqIHZhbHVlIGlzIDUuIEFtb3VudHMgY2FuIGRlc2NyaWJlIGZ1bmdpYmxlIGFuZCBub24tZnVuZ2libGUgZGlnaXRhbFxuICogYXNzZXRzLiBBbW91bnRzIGFyZSBwYXNzLWJ5LWNvcHkgYW5kIGNhbiBiZSBtYWRlIGJ5IGFuZCBzZW50IHRvXG4gKiBhbnlvbmUuXG4gKlxuICogVGhlIGlzc3VlciBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2Ugb2YgdGhlIGFtb3VudCBpbiBwYXltZW50c1xuICogYW5kIHB1cnNlcy4gVGhlIGlzc3VlciBtdXN0IGJlIGFibGUgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgYWRkXG4gKiBkaWdpdGFsIGFzc2V0cyB0byBhIHB1cnNlIGFuZCB3aXRoZHJhdyBkaWdpdGFsIGFzc2V0cyBmcm9tIGEgcHVyc2UuXG4gKiBUbyBkbyBzbywgaXQgbXVzdCBrbm93IGhvdyB0byBhZGQgYW5kIHN1YnRyYWN0IGRpZ2l0YWwgYXNzZXRzLlxuICogUmF0aGVyIHRoYW4gaGFyZC1jb2RpbmcgYSBwYXJ0aWN1bGFyIHNvbHV0aW9uLCB3ZSBjaG9zZSB0b1xuICogcGFyYW1ldGVyaXplIHRoZSBpc3N1ZXIgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcG9seW1vcnBoaWMgZnVuY3Rpb25zLFxuICogd2hpY2ggd2UgY2FsbCBgQW1vdW50TWF0aGAuIFRoZXNlIG1hdGggZnVuY3Rpb25zIGluY2x1ZGUgY29uY2VwdHNcbiAqIGxpa2UgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLlxuICpcbiAqIFdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29uZnVzaW9uIGFzIHRvIHdoYXQga2luZCBvZlxuICogYXNzZXQgd2UgYXJlIHVzaW5nLiBUaHVzLCBBbW91bnRNYXRoIGluY2x1ZGVzIGNoZWNrcyBvZiB0aGVcbiAqIGBicmFuZGAsIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldC4gSWZcbiAqIHRoZSB3cm9uZyBicmFuZCBpcyB1c2VkIGluIEFtb3VudE1hdGgsIGFuIGVycm9yIGlzIHRocm93biBhbmQgdGhlXG4gKiBvcGVyYXRpb24gZG9lcyBub3Qgc3VjY2VlZC5cbiAqXG4gKiBBbW91bnRNYXRoIHVzZXMgbWF0aEhlbHBlcnMgdG8gZG8gbW9zdCBvZiB0aGUgd29yaywgYnV0IHRoZW4gYWRkc1xuICogdGhlIGJyYW5kIHRvIHRoZSByZXN1bHQuIFRoZSBmdW5jdGlvbiBgdmFsdWVgIGdldHMgdGhlIHZhbHVlIGZyb21cbiAqIHRoZSBhbW91bnQgYnkgcmVtb3ZpbmcgdGhlIGJyYW5kIChhbW91bnQgLT4gdmFsdWUpLCBhbmQgdGhlXG4gKiBmdW5jdGlvbiBgbWFrZWAgYWRkcyB0aGUgYnJhbmQgdG8gcHJvZHVjZSBhbiBhbW91bnQgKHZhbHVlIC0+XG4gKiBhbW91bnQpLiBUaGUgZnVuY3Rpb24gYGNvZXJjZWAgdGFrZXMgYW4gYW1vdW50IGFuZCBjaGVja3MgaXQsXG4gKiByZXR1cm5pbmcgYW4gYW1vdW50IChhbW91bnQgLT4gYW1vdW50KS5cbiAqXG4gKiBFYWNoIGlzc3VlciBvZiBkaWdpdGFsIGFzc2V0cyBoYXMgYW4gYXNzb2NpYXRlZCBicmFuZCBpbiBhXG4gKiBvbmUtdG8tb25lIG1hcHBpbmcuIEluIHVudHJ1c3RlZCBjb250ZXh0cywgc3VjaCBhcyBpbiBhbmFseXppbmdcbiAqIHBheW1lbnRzIGFuZCBhbW91bnRzLCB3ZSBjYW4gZ2V0IHRoZSBicmFuZCBhbmQgZmluZCB0aGUgaXNzdWVyXG4gKiB3aGljaCBtYXRjaGVzIHRoZSBicmFuZC4gVGhlIGlzc3VlciBhbmQgdGhlIGJyYW5kIG11dHVhbGx5IHZhbGlkYXRlXG4gKiBlYWNoIG90aGVyLlxuICovXG5cbmNvbnN0IGhlbHBlcnM9e1xubmF0Om5hdE1hdGhIZWxwZXJzLFxuc2V0OnNldE1hdGhIZWxwZXJzLFxuY29weVNldDpjb3B5U2V0TWF0aEhlbHBlcnMsXG5jb3B5QmFnOmNvcHlCYWdNYXRoSGVscGVyc307XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZSB7KHZhbHVlOiBWKSA9PiBBc3NldEtpbmRGb3JWYWx1ZTxWPn1cbiAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQ9KHZhbHVlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbHVlKTtcbmlmKHBhc3NTdHlsZT09PSdiaWdpbnQnKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nbmF0JztcbiB9XG5pZihwYXNzU3R5bGU9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ3NldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLnNldCgpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlTZXQnO1xuIH1cbmlmKG1hdGNoZXModmFsdWUsTS5iYWcoKSkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidjb3B5QmFnJztcbiB9XG5hc3NlcnQuZmFpbChcbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cblggYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtwYXNzU3R5bGV9YCk7XG5cbiB9O1xuXG4vKipcbiAqXG4gKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgYSB2YWxpZCBBbW91bnRNYXRoIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBoZWxwZXJzLlxuICpcbiAqIE1hZGUgYXZhaWxhYmxlIG9ubHkgZm9yIHRlc3RpbmcsIGJ1dCBpdCBpcyBoYXJtbGVzcyBmb3Igb3RoZXIgdXNlcy5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAcGFyYW0ge1Z9IHZhbHVlXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Vj59XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRWYWx1ZUdldEhlbHBlcnM9KHZhbHVlKT0+XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKiogQHR5cGUgeyhhbGxlZ2VkQnJhbmQ6IEJyYW5kLCBicmFuZD86IEJyYW5kKSA9PiB2b2lkfSAqLyRo4oCNX29uY2UuYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFzc2VydFZhbHVlR2V0SGVscGVycyk7XG5jb25zdCBvcHRpb25hbEJyYW5kQ2hlY2s9KGFsbGVnZWRCcmFuZCxicmFuZCk9PntcbmlmKGJyYW5kIT09dW5kZWZpbmVkKXtcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydC5lcXVhbChcbmFsbGVnZWRCcmFuZCxcbmJyYW5kLFxuWCBgYW1vdW50J3MgYnJhbmQgJHthbGxlZ2VkQnJhbmR9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHticmFuZH1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+IHwgdW5kZWZpbmVkfSBicmFuZFxuICogQHJldHVybnMge01hdGhIZWxwZXJzPCo+fVxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycz0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQobGVmdEFtb3VudCwnbGVmdEFtb3VudCcpO1xuYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCdyaWdodEFtb3VudCcpO1xuY29uc3R7dmFsdWU6bGVmdFZhbHVlLGJyYW5kOmxlZnRCcmFuZH09bGVmdEFtb3VudDtcbmNvbnN0e3ZhbHVlOnJpZ2h0VmFsdWUsYnJhbmQ6cmlnaHRCcmFuZH09cmlnaHRBbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCdsZWZ0QnJhbmQnKTtcbmFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCdyaWdodEJyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLGJyYW5kKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLGJyYW5kKTtcbmFzc2VydC5lcXVhbChcbmxlZnRCcmFuZCxcbnJpZ2h0QnJhbmQsXG5YIGBCcmFuZHMgaW4gbGVmdCAke2xlZnRCcmFuZH0gYW5kIHJpZ2h0ICR7cmlnaHRCcmFuZH0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgKTtcblxuY29uc3QgbGVmdEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG5jb25zdCByaWdodEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdEhlbHBlcnMsXG5yaWdodEhlbHBlcnMsXG5YIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYCk7XG5cbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmRcbiAqIHBheW1lbnRzLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGluZ3MgbGlrZSBjdXJyZW5jeSwgc3RvY2ssIGFuZCB0aGVcbiAqIGFic3RyYWN0IHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBleGNoYW5nZS5cbiAqL1xuY29uc3QgQW1vdW50TWF0aD17XG4vKipcbiAqIE1ha2UgYW4gYW1vdW50IGZyb20gYSB2YWx1ZSBieSBhZGRpbmcgdGhlIGJyYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBc3NldFZhbHVlRm9yS2luZDxLPn0gYWxsZWdlZFZhbHVlXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG4vKiBhbGxlZ2VkVmFsdWUgaGFzIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBmb3IgdHlwZSB3aWRlbmluZywgdG8gcHJldmVudCBWIGJlaW5nIGJvdW5kIHRvIGEgYSBsaXRlcmFsIGxpa2UgMW4qL1xubWFrZTooYnJhbmQsYWxsZWdlZFZhbHVlKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbmNvbnN0IHZhbHVlPWguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogTWFrZSBzdXJlIHRoaXMgYW1vdW50IGlzIHZhbGlkIGVub3VnaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmdcbiAqIHZhbGlkIGFtb3VudCBpZiBzby5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbGxlZ2VkQW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5jb2VyY2U6KGJyYW5kLGFsbGVnZWRBbW91bnQpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWU6YWxsZWdlZFZhbHVlfT1hbGxlZ2VkQW1vdW50O1xuYnJhbmQ9PT1hbGxlZ2VkQnJhbmR8fFxuYXNzZXJ0LmZhaWwoXG5YIGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gKTtcblxuLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsYWxsZWdlZFZhbHVlKTtcbiB9LFxuLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fVxuICovXG5nZXRWYWx1ZTooYnJhbmQsYW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYW1vdW50KS52YWx1ZSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGVcbiAqIGlkZW50aXR5IGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZCwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xubWFrZUVtcHR5OihicmFuZCxhc3NldEtpbmQ9LyoqIEB0eXBlIHtjb25zdH0gKi8nbmF0Jyk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuY29uc3QgdmFsdWU9aGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXJcbiAqIGFtb3VudCBhcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYWtlRW1wdHlGcm9tQW1vdW50OihhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kLHZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ9fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxuICogcmlnaHRBbW91bnQuIEZvciBub24tc2NhbGFycywgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzXG4gKiBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSxcbiAqIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGVcbiAqIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieSB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzR1RFOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWVcbiAqIHRoYXQgaWYgaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRXF1YWw6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBib3RoIGxlZnRBbW91bnQgYW5kIHJpZ2h0QW1vdW50LlxuICpcbiAqIEZvciBmdW5naWJsZSBhbW91bnQgdGhpcyBtZWFucyBhZGRpbmcgdGhlIHZhbHVlcy4gRm9yIG90aGVyIGtpbmRzIG9mXG4gKiBhbW91bnQsIGl0IHVzdWFsbHkgbWVhbnMgaW5jbHVkaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSBib3RoXG4gKiBsZWZ0IGFuZCByaWdodC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5hZGQ6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9BZGQoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnRcbiAqIChpLmUuIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlXG4gKiByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnQgZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50XG4gKiAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgIGFuIGVycm9yLiBCZWNhdXNlIHRoZVxuICogbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UIGVxdWl2YWxlbnRcbiAqIHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1pbjooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PkFtb3VudE1hdGguaXNHVEUoeCx5LGJyYW5kKT95OngsXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PkFtb3VudE1hdGguaXNHVEUoeCx5LGJyYW5kKT94Onl9OyRo4oCNX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcblxuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGwopzTyBQAA8gUAACcAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LFgsZml0LERpc3BsYXlJbmZvU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJkZXRhaWxzXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZURpc3BsYXlJbmZvPShhbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kKT0+e1xuZml0KGFsbGVnZWREaXNwbGF5SW5mbyxEaXNwbGF5SW5mb1NoYXBlLCdkaXNwbGF5SW5mbycpO1xuXG5pZihhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kIT09dW5kZWZpbmVkKXtcbmFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQ9PT1hc3NldEtpbmR8fFxuYXNzZXJ0LmZhaWwoXG5YIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgKTtcblxuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbmFzc2VydC5mYWlsKFxuWCBgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuXG4gfVxuXG5yZXR1cm4gZGlzcGxheUluZm87XG4gfTskaOKAjV9vbmNlLmNvZXJjZURpc3BsYXlJbmZvKGNvZXJjZURpc3BsYXlJbmZvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJvSw40wEAANMBAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW11dLFtcIi4vaXNzdWVyS2l0LmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANpYetwzGwAAMxsAACUAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vZGlzcGxheUluZm8uanMiLCIuL3BheW1lbnRMZWRnZXIuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0Iiwidml2aWZ5SXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHZpdmlmeVBheW1lbnRMZWRnZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIiwgWyRo4oCNX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1widml2aWZ5UGF5bWVudExlZGdlclwiLCBbJGjigI1fYSA9PiAodml2aWZ5UGF5bWVudExlZGdlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZT19IG9wdFNodXRkb3duV2l0aEZhaWx1cmUgSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlJc3N1ZXJLaXQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBuYW1lPWlzc3VlckJhZ2dhZ2UuZ2V0KCduYW1lJyk7XG4vKiogQHR5cGUge0t9ICovXG5jb25zdCBhc3NldEtpbmQ9aXNzdWVyQmFnZ2FnZS5nZXQoJ2Fzc2V0S2luZCcpO1xuY29uc3QgZGlzcGxheUluZm89aXNzdWVyQmFnZ2FnZS5nZXQoJ2Rpc3BsYXlJbmZvJyk7XG5jb25zdCBlbGVtZW50U2hhcGU9aXNzdWVyQmFnZ2FnZS5nZXQoJ2VsZW1lbnRTaGFwZScpO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4vKiBBZGQgYXNzZXRLaW5kIHRvIGRpc3BsYXlJbmZvLCBvciBvdmVycmlkZSBpZiBwcmVzZW50Ki9cbmNvbnN0IGNsZWFuRGlzcGxheUluZm89Y29lcmNlRGlzcGxheUluZm8oZGlzcGxheUluZm8sYXNzZXRLaW5kKTtcbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlLCdmdW5jdGlvbicpO1xuIH1cblxuaWYoZWxlbWVudFNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oZWxlbWVudFNoYXBlKTtcbiB9XG5cbi8qIEF0dGVudWF0ZSB0aGUgcG93ZXJmdWwgYXV0aG9yaXR5IHRvIG1pbnQgYW5kIGNoYW5nZSBiYWxhbmNlcyovXG4vKiogQHR5cGUge1BheW1lbnRMZWRnZXI8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5jb25zdHtpc3N1ZXIsbWludCxicmFuZH09dml2aWZ5UGF5bWVudExlZGdlcihcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuY2xlYW5EaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYnJhbmQsXG5pc3N1ZXIsXG5taW50LFxuZGlzcGxheUluZm86Y2xlYW5EaXNwbGF5SW5mb30pO1xuXG4gfTskaOKAjV9vbmNlLnZpdmlmeUlzc3VlcktpdCh2aXZpZnlJc3N1ZXJLaXQpO1xuaGFyZGVuKHZpdmlmeUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPUFzc2V0S2luZC5OQVRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtQYXJ0aWFsPHtlbGVtZW50U2hhcGU6IFBhdHRlcm59Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUR1cmFibGVJc3N1ZXJLaXQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG4vKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuYXNzZXRLaW5kPUFzc2V0S2luZC5OQVQsXG5kaXNwbGF5SW5mbz1oYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQsXG57ZWxlbWVudFNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnbmFtZScsbmFtZSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ2Fzc2V0S2luZCcsYXNzZXRLaW5kKTtcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnZGlzcGxheUluZm8nLGRpc3BsYXlJbmZvKTtcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnZWxlbWVudFNoYXBlJyxlbGVtZW50U2hhcGUpO1xucmV0dXJuIHZpdmlmeUlzc3VlcktpdChpc3N1ZXJCYWdnYWdlLG9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuIH07JGjigI1fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz0nbmF0J11cbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZD0nbmF0J11cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSXNzdWVyS2l0PShcbm5hbWUsXG4vKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuYXNzZXRLaW5kPUFzc2V0S2luZC5OQVQsXG5kaXNwbGF5SW5mbz1oYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQsXG57ZWxlbWVudFNoYXBlPXVuZGVmaW5lZH09e30pPT5cblxubWFrZUR1cmFibGVJc3N1ZXJLaXQoXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ2Ryb3BwZWQgaXNzdWVyIGtpdCcse2R1cmFibGU6dHJ1ZX0pLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbntlbGVtZW50U2hhcGV9KTskaOKAjV9vbmNlLm1ha2VJc3N1ZXJLaXQobWFrZUlzc3VlcktpdCk7XG5cbmhhcmRlbihtYWtlSXNzdWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlJc3N1ZXJLaXQiOlsidml2aWZ5SXNzdWVyS2l0Il0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAApLuyRjAUAAIwFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxmaXQsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ1ZhbHVlfSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlCYWcoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5QmFnVmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgY29weUJhZ01hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooYmFnKT0+e1xuZml0KGJhZyxNLmJhZygpLCdiYWcgb2YgYW1vdW50Jyk7XG5yZXR1cm4gYmFnO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGJhZyk9PmdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoPT09MCxcbmRvSXNHVEU6YmFnSXNTdXBlcmJhZyxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOmJhZ1VuaW9uLFxuZG9TdWJ0cmFjdDpiYWdEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOWIulyZBQAAmQUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5U2V0LGZpdCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weVNldChbXSk7XG5cbi8qKlxuICogQHR5cGUge0NvcHlTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9PntcbmZpdChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF+1eMQcBgAAHAYAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvbmF0Il0sImV4cG9ydHMiOlsibmF0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGlzTmF0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV0sW1wiaXNOYXRcIiwgWyRo4oCNX2EgPT4gKGlzTmF0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0IGVtcHR5PTBuO1xuXG4vKipcbiAqIEZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHVzZSB0aGUgbmF0TWF0aEhlbHBlcnMgdG8gbWFuYWdlIGJhbGFuY2VzIC1cbiAqIHRoZSBvcGVyYXRpb25zIGFyZSBtZXJlbHkgYXJpdGhtZXRpYyBvbiBuYXR1cmFsLCBub24tbmVnYXRpdmVcbiAqIG51bWJlcnMuXG4gKlxuICogTmF0dXJhbCBudW1iZXJzIGFyZSB1c2VkIGZvciBmdW5naWJsZSBlcmlnaHRzIHN1Y2ggYXMgbW9uZXkgYmVjYXVzZVxuICogcm91bmRpbmcgaXNzdWVzIG1ha2UgZmxvYXRzIHByb2JsZW1hdGljLiBBbGwgb3BlcmF0aW9ucyBzaG91bGQgYmVcbiAqIGRvbmUgd2l0aCB0aGUgc21hbGxlc3Qgd2hvbGUgdW5pdCBzdWNoIHRoYXQgdGhlIE5hdE1hdGhIZWxwZXJzIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuYXNzZXJ0KGlzTmF0KG5hdCksWCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmApO1xucmV0dXJuIE5hdChuYXQpO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KG5hdCk9Pm5hdD09PWVtcHR5LFxuZG9Jc0dURToobGVmdCxyaWdodCk9PmxlZnQ+PXJpZ2h0LFxuZG9Jc0VxdWFsOihsZWZ0LHJpZ2h0KT0+bGVmdD09PXJpZ2h0LFxuLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbmRvQWRkOihsZWZ0LHJpZ2h0KT0+bGVmdCtyaWdodCxcbmRvU3VidHJhY3Q6KGxlZnQscmlnaHQpPT5OYXQobGVmdC1yaWdodCl9KTskaOKAjV9vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRNYXRoSGVscGVycyI6WyJuYXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACRgLmufwcAAH8HAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dLFtcImNvZXJjZVRvRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7U2V0TWF0aEhlbHBlcnN9XG4gKi9cbmNvbnN0ICAgICAgICBzZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KGxpc3QpPT57XG5saXN0PWNvZXJjZVRvRWxlbWVudHMobGlzdCk7XG4vKiBBc3NlcnQgdGhhdCBsaXN0IGNvbnRhaW5zIG9ubHkqL1xuLyogKiBwYXNzLWJ5LWNvcHkgcHJpbWl0aXZlcywqL1xuLyogKiBwYXNzLWJ5LWNvcHkgY29udGFpbmVycyBjb250YWluaW5nIGtleXMsKi9cbi8qICogcmVtb3RhYmxlcy4qL1xuYXNzZXJ0S2V5KGxpc3QpO1xucmV0dXJuIGxpc3Q7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobGlzdCk9PnBhc3NTdHlsZU9mKGxpc3QpPT09J2NvcHlBcnJheScmJmxpc3QubGVuZ3RoPT09MCxcbmRvSXNHVEU6ZWxlbWVudHNJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOih4LHkpPT5lbGVtZW50c0NvbXBhcmUoeCx5KT09PTAsXG5kb0FkZDplbGVtZW50c0Rpc2pvaW50VW5pb24sXG5kb1N1YnRyYWN0OmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldE1hdGhIZWxwZXJzIjpbInNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAARUPyuBBAAAgQQAACMAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbInZpdmlmeVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSx2aXZpZnlGYXJDbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJ2aXZpZnlGYXJDbGFzc1wiLCBbJGjigI1fYSA9PiAodml2aWZ5RmFyQ2xhc3MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlQYXltZW50S2luZD0oaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKT0+e1xuY29uc3QgbWFrZVBheW1lbnQ9dml2aWZ5RmFyQ2xhc3MoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IHBheW1lbnRgLFxuUGF5bWVudEksXG5pbml0RW1wdHksXG57XG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9fSk7XG5cblxucmV0dXJuIG1ha2VQYXltZW50O1xuIH07JGjigI1fb25jZS52aXZpZnlQYXltZW50S2luZCh2aXZpZnlQYXltZW50S2luZCk7XG5oYXJkZW4odml2aWZ5UGF5bWVudEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeVBheW1lbnRLaW5kIjpbInZpdmlmeVBheW1lbnRLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKQ7p4ffPAAA3zwAACkAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudExlZGdlci5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsidml2aWZ5UGF5bWVudExlZGdlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q29weUFycmF5LGZpdCxNLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHZpdmlmeUZhckluc3RhbmNlLEFtb3VudE1hdGgsdml2aWZ5UGF5bWVudEtpbmQsdml2aWZ5UHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q29weUFycmF5XCIsIFskaOKAjV9hID0+IChhc3NlcnRDb3B5QXJyYXkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiLCBbJGjigI1fYSA9PiAodml2aWZ5RmFySW5zdGFuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1widml2aWZ5UGF5bWVudEtpbmRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeVBheW1lbnRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vcHVyc2UuanNcIiwgW1tcInZpdmlmeVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAodml2aWZ5UHVyc2VLaW5kID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRJXCIsIFskaOKAjV9hID0+IChCcmFuZEkgPSAkaOKAjV9hKV1dLFtcIm1ha2VJc3N1ZXJJbnRlcmZhY2VzXCIsIFskaOKAjV9hID0+IChtYWtlSXNzdWVySW50ZXJmYWNlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlPShicmFuZCxhc3NldEtpbmQsZWxlbWVudFNoYXBlKT0+e1xubGV0IHZhbHVlU2hhcGU7XG5zd2l0Y2goYXNzZXRLaW5kKXtcbmNhc2UnbmF0Jzp7XG52YWx1ZVNoYXBlPU0ubmF0KCk7XG5lbGVtZW50U2hhcGU9PT11bmRlZmluZWR8fFxuYXNzZXJ0LmZhaWwoXG5YIGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gKTtcblxuYnJlYWs7XG4gfVxuY2FzZSdzZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0uYW5kKE0ua2V5KCksZWxlbWVudFNoYXBlKSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5U2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLnNldCgpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmJhZygpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YCk7XG4gfX1cblxuXG5jb25zdCBhbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQsLyogbWF0Y2hlcyBvbmx5IHRoaXMgZXhhY3QgYnJhbmQqL1xudmFsdWU6dmFsdWVTaGFwZX0pO1xuXG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfTtcblxuLyoqXG4gKiBNYWtlIHRoZSBwYXltZW50TGVkZ2VyLCB0aGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgYmFsYW5jZXMgb2ZcbiAqIHBheW1lbnRzLiBBbGwgbWludGluZyBhbmQgdHJhbnNmZXIgYXV0aG9yaXR5IG9yaWdpbmF0ZXMgaGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7RGlzcGxheUluZm88Sz59IGRpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbmNvbnN0IGJyYW5kPXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBlbXB0eUFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuY29uc3QgYW1vdW50U2hhcGU9YW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5lbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0e0lzc3VlckksTWludEksUGF5bWVudEksUHVyc2VJS2l0fT1tYWtlSXNzdWVySW50ZXJmYWNlcyhcbmJyYW5kLFxuYXNzZXRLaW5kLFxuYW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0IG1ha2VQYXltZW50PXZpdmlmeVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInKTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCJcbiAqIHBheW1lbnRzLiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmVcbiAqIHBheW1lbnRzIGFyZSByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5XG4gKiB3aXRoIHRoaXMgd2Vha21hcCBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmVcbiAqIGluLlxuICogQSBidW5jaCBvZiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKiAgICAqIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgXG4gKiAgICAgIHdlYWtNYXAgaXMgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogICAgKiBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seVxuICogICAgICBpbiBhdCBtb3N0IG9uZSByZWNvdmVyeSBzZXQuXG4gKiAgICAqIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqICAgICogRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG9cbiAqICAgICAgaXQuXG4gKiAgICAqIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbVxuICogICAgICB0aGF0IHB1cnNlIGFuZCBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudCB9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IHN1YnRyYWN0PShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5zdWJ0cmFjdChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW4gfSAqL1xuY29uc3QgaXNFcXVhbD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguaXNFcXVhbChsZWZ0LHJpZ2h0LGJyYW5kKTtcblxuLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlclxuICogYG9wdEFtb3VudFNoYXBlYFxuICogd2hpY2gsIGlmIHByZXNlbnQsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBiYWxhbmNlIG9mIHRoZVxuICogcGF5bWVudC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZG9lcyB0aGF0IGNoZWNrLlxuICpcbiAqIE5vdGU6IGBvcHRBbW91bnRTaGFwZWAgaXMgdXNlci1zdXBwbGllZCB3aXRoIG5vIHByZXZpb3VzIHZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHBheW1lbnRCYWxhbmNlXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbmFzc2VydC5mYWlsKFxuWCBgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG5icmFuZClcbiB9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gKTtcblxuIH07XG5cbi8qKlxuICogUmVhbGxvY2F0ZSBhc3NldHMgZnJvbSB0aGUgYHBheW1lbnRzYCBwYXNzZWQgaW4gdG8gbmV3IHBheW1lbnRzXG4gKiBjcmVhdGVkIGFuZCByZXR1cm5lZCwgd2l0aCBiYWxhbmNlcyBmcm9tIGBuZXdQYXltZW50QmFsYW5jZXNgLlxuICogRW5mb3JjZXMgdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIG9ubHkgb3BlcmF0aW9uIHRoYXQgbW92ZXMgYXNzZXRzLlxuICogYHB1cnNlLmRlcG9zaXRgIGFuZCBgcHVyc2Uud2l0aGRyYXdgIG1vdmUgYXNzZXRzIGJldHdlZW4gYSBwdXJzZSBhbmRcbiAqIGEgcGF5bWVudCwgYW5kIHNvIG11c3QgYWxzbyBlbmZvcmNlIGNvbnNlcnZhdGlvbiB0aGVyZS5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnRbXX0gcGF5bWVudHNcbiAqIEBwYXJhbSB7QW1vdW50W119IG5ld1BheW1lbnRCYWxhbmNlc1xuICogQHJldHVybnMge1BheW1lbnRbXX1cbiAqL1xuY29uc3QgbW92ZUFzc2V0cz0ocGF5bWVudHMsbmV3UGF5bWVudEJhbGFuY2VzKT0+e1xuYXNzZXJ0Q29weUFycmF5KHBheW1lbnRzLCdwYXltZW50cycpO1xuYXNzZXJ0Q29weUFycmF5KG5ld1BheW1lbnRCYWxhbmNlcywnbmV3UGF5bWVudEJhbGFuY2VzJyk7XG5cbi8qIFRoZXJlIG1heSBiZSB6ZXJvLCBvbmUsIG9yIG1hbnkgcGF5bWVudHMgYXMgaW5wdXQgdG8qL1xuLyogbW92ZUFzc2V0cy4gV2Ugd2FudCB0byBwcm90ZWN0IGFnYWluc3Qgc29tZW9uZSBwYXNzaW5nIGluKi9cbi8qIHdoYXQgYXBwZWFycyB0byBiZSBtdWx0aXBsZSBwYXltZW50cyB0aGF0IHR1cm4gb3V0IHRvIGFjdHVhbGx5Ki9cbi8qIGJlIHRoZSBzYW1lIHBheW1lbnQgKGFuIGFsaWFzaW5nIGlzc3VlKS4gVGhlIGBjb21iaW5lYCBtZXRob2QqL1xuLyogbGVnaXRpbWF0ZWx5IG5lZWRzIHRvIHRha2UgaW4gbXVsdGlwbGUgcGF5bWVudHMsIGJ1dCB3ZSBkb24ndCovXG4vKiBuZWVkIHRvIHBheSB0aGUgY29zdHMgb2YgcHJvdGVjdGluZyBhZ2FpbnN0IGFsaWFzaW5nIGZvciB0aGUqL1xuLyogb3RoZXIgdXNlcy4qL1xuXG5pZihwYXltZW50cy5sZW5ndGg+MSl7XG5jb25zdCBhbnRpQWxpYXNpbmdTdG9yZT1uZXcgU2V0KCk7XG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+e1xuIWFudGlBbGlhc2luZ1N0b3JlLmhhcyhwYXltZW50KXx8XG5hc3NlcnQuZmFpbChYIGBzYW1lIHBheW1lbnQgJHtwYXltZW50fSBzZWVuIHR3aWNlYCk7XG5hbnRpQWxpYXNpbmdTdG9yZS5hZGQocGF5bWVudCk7XG4gfSk7XG4gfVxuXG5jb25zdCB0b3RhbD1wYXltZW50cy5tYXAocGF5bWVudExlZGdlci5nZXQpLnJlZHVjZShhZGQsZW1wdHlBbW91bnQpO1xuXG5jb25zdCBuZXdUb3RhbD1uZXdQYXltZW50QmFsYW5jZXMucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbi8qIEludmFyaWFudCBjaGVjayovXG5pc0VxdWFsKHRvdGFsLG5ld1RvdGFsKXx8XG5hc3NlcnQuZmFpbChYIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke25ld1RvdGFsfWApO1xuXG5sZXQgbmV3UGF5bWVudHM7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQqL1xucGF5bWVudHMuZm9yRWFjaCgocGF5bWVudCk9PmRlbGV0ZVBheW1lbnQocGF5bWVudCkpO1xuXG5uZXdQYXltZW50cz1uZXdQYXltZW50QmFsYW5jZXMubWFwKChiYWxhbmNlKT0+e1xuY29uc3QgbmV3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQobmV3UGF5bWVudCxiYWxhbmNlLHVuZGVmaW5lZCk7XG5yZXR1cm4gbmV3UGF5bWVudDtcbiB9KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gaGFyZGVuKG5ld1BheW1lbnRzKTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgZGVwb3NpdFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZT11bmRlZmluZWQpPT5cbntcbmFzc2VydChcbiFpc1Byb21pc2Uoc3JjUGF5bWVudCksXG4gYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG5UeXBlRXJyb3IpO1xuXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9YWRkKHNyY1BheW1lbnRCYWxhbmNlLGN1cnJlbnRCYWxhbmNlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG4vKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbi8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbmFzc2VydC5mYWlsKFxuWCBgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7Y3VycmVudEJhbGFuY2V9YCk7XG5cbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1zdWJ0cmFjdChjdXJyZW50QmFsYW5jZSxhbW91bnQpO1xuXG5jb25zdCBwYXltZW50PW1ha2VQYXltZW50KCk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQgTW92ZSB0aGUgd2l0aGRyYXduIGFzc2V0cyBmcm9tIHRoaXMgcHVyc2UgaW50byovXG4vKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbmluaXRQYXltZW50KHBheW1lbnQsYW1vdW50LHJlY292ZXJ5U2V0KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudDtcbiB9O1xuXG5jb25zdCBtYWtlRW1wdHlQdXJzZT12aXZpZnlQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbmNvbnN0IGlzc3Vlcj12aXZpZnlGYXJJbnN0YW5jZShpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG5nZXRBbW91bnRPZihwYXltZW50KXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xucmV0dXJuIHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuIH0sXG5cbmJ1cm4ocGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5jb25zdCBwYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5ULiovXG5kZWxldGVQYXltZW50KHBheW1lbnQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50QmFsYW5jZTtcbiB9LFxuY2xhaW0oc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0W3BheW1lbnRdPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbc3JjUGF5bWVudEJhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0sXG5jb21iaW5lKGZyb21QYXltZW50c1BBcnJheSxvcHRUb3RhbEFtb3VudD11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkb2VzICpub3QqIGRlbGF5IGNhbGxpbmcgYGNvbWJpbmVgLCBidXQgcmF0aGVyIGxlYXZlcyBpdCovXG4vKiB0byBgY29tYmluZWAgdG8gZGVsYXkgZnVydGhlciBwcm9jZXNzaW5nIHVudGlsIGFsbCB0aGUgZWxlbWVudHMgb2YqL1xuLyogYGZyb21QYXltZW50c1BBcnJheWAgaGF2ZSBmdWxmaWxsZWQuKi9cblxuLyogUGF5bWVudHMgaW4gYGZyb21QYXltZW50c1BBcnJheWAgbXVzdCBiZSBkaXN0aW5jdC4gQWxpYXMqL1xuLyogY2hlY2tpbmcgaXMgZGVsZWdhdGVkIHRvIHRoZSBgbW92ZUFzc2V0c2AgZnVuY3Rpb24uKi9cbnJldHVybiBQcm9taXNlLmFsbChmcm9tUGF5bWVudHNQQXJyYXkpLnRoZW4oKGZyb21QYXltZW50c0FycmF5KT0+e1xuZnJvbVBheW1lbnRzQXJyYXkuZXZlcnkoYXNzZXJ0TGl2ZVBheW1lbnQpO1xuY29uc3QgdG90YWxQYXltZW50c0JhbGFuY2U9ZnJvbVBheW1lbnRzQXJyYXkuXG5tYXAocGF5bWVudExlZGdlci5nZXQpLlxucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHRvdGFsUGF5bWVudHNCYWxhbmNlLG9wdFRvdGFsQW1vdW50KTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdFtwYXltZW50XT1tb3ZlQXNzZXRzKFxuaGFyZGVuKGZyb21QYXltZW50c0FycmF5KSxcbmhhcmRlbihbdG90YWxQYXltZW50c0JhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0pO1xuIH0sXG5zcGxpdChzcmNQYXltZW50LHBheW1lbnRBbW91bnRBKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbnBheW1lbnRBbW91bnRBPWNvZXJjZShwYXltZW50QW1vdW50QSk7XG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuY29uc3QgcGF5bWVudEFtb3VudEI9c3VidHJhY3Qoc3JjUGF5bWVudEJhbGFuY2UscGF5bWVudEFtb3VudEEpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0IG5ld1BheW1lbnRzPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbcGF5bWVudEFtb3VudEEscGF5bWVudEFtb3VudEJdKSk7XG5cbnJldHVybiBuZXdQYXltZW50cztcbiB9LFxuc3BsaXRNYW55KHNyY1BheW1lbnQsYW1vdW50cyl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmFzc2VydENvcHlBcnJheShhbW91bnRzLCdhbW91bnRzJyk7XG5hbW91bnRzPWFtb3VudHMubWFwKGNvZXJjZSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3QgbmV3UGF5bWVudHM9bW92ZUFzc2V0cyhoYXJkZW4oW3NyY1BheW1lbnRdKSxoYXJkZW4oYW1vdW50cykpO1xucmV0dXJuIG5ld1BheW1lbnRzO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbmZpdChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbmluaXRQYXltZW50KHBheW1lbnQsbmV3QW1vdW50LHVuZGVmaW5lZCk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmR9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnZpdmlmeVBheW1lbnRMZWRnZXIodml2aWZ5UGF5bWVudExlZGdlcik7XG5oYXJkZW4odml2aWZ5UGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5UGF5bWVudExlZGdlciI6WyJ2aXZpZnlQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALlEVLjuDgAA7g4AACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdml2aWZ5RmFyQ2xhc3NLaXQsbWFrZVNjYWxhckJpZ1NldFN0b3JlLEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInZpdmlmeUZhckNsYXNzS2l0XCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJDbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgICAgICAgIHZpdmlmeVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD12aXZpZnlGYXJDbGFzc0tpdChcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gUHVyc2VgLFxuUHVyc2VJS2l0LFxuKCk9PntcbmNvbnN0IGN1cnJlbnRCYWxhbmNlPUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5cbi8qKiBAdHlwZSB7U2V0U3RvcmU8UGF5bWVudD59ICovXG5jb25zdCByZWNvdmVyeVNldD1tYWtlU2NhbGFyQmlnU2V0U3RvcmUoJ3JlY292ZXJ5IHNldCcse1xuZHVyYWJsZTp0cnVlfSk7XG5cblxucmV0dXJue1xuY3VycmVudEJhbGFuY2UsXG5yZWNvdmVyeVNldH07XG5cbiB9LFxue1xucHVyc2U6e1xuZGVwb3NpdChzcmNQYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogU2VlIHRoZSBjb21tZW50cyBvbiBQdXJzZUkuZGVwb3NpdCBpbiB0eXBlR3VhcmRzLmpzKi9cbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIGRlcG9zaXQuKi9cbnJldHVybiBkZXBvc2l0SW50ZXJuYWwoXG5zdGF0ZS5jdXJyZW50QmFsYW5jZSxcbihuZXdQdXJzZUJhbGFuY2UpPT5cbnVwZGF0ZVB1cnNlQmFsYW5jZShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UsdGhpcy5mYWNldHMucHVyc2UpLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlLFxuc3RhdGUucmVjb3ZlcnlTZXQpO1xuXG4gfSxcbndpdGhkcmF3KGFtb3VudCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiB3aXRoZHJhdy4qL1xucmV0dXJuIHdpdGhkcmF3SW50ZXJuYWwoXG5zdGF0ZS5jdXJyZW50QmFsYW5jZSxcbihuZXdQdXJzZUJhbGFuY2UpPT5cbnVwZGF0ZVB1cnNlQmFsYW5jZShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UsdGhpcy5mYWNldHMucHVyc2UpLFxuYW1vdW50LFxuc3RhdGUucmVjb3ZlcnlTZXQpO1xuXG4gfSxcbmdldEN1cnJlbnRBbW91bnQoKXtcbnJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnRCYWxhbmNlO1xuIH0sXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKXtcbnJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuIH0sXG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmdldERlcG9zaXRGYWNldCgpe1xucmV0dXJuIHRoaXMuZmFjZXRzLmRlcG9zaXRGYWNldDtcbiB9LFxuXG5nZXRSZWNvdmVyeVNldCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiB9LFxucmVjb3ZlckFsbCgpe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xubGV0IGFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuZm9yKGNvbnN0IHBheW1lbnQgb2Ygc3RhdGUucmVjb3ZlcnlTZXQua2V5cygpKXtcbi8qIFRoaXMgZG9lcyBjYXVzZSBkZWxldGlvbnMgZnJvbSB0aGUgc2V0IHdoaWxlIGl0ZXJhdGluZywqL1xuLyogYnV0IHRoaXMgc3BlY2lhbCBjYXNlIGlzIGFsbG93ZWQuKi9cbmNvbnN0IGRlbHRhPWZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuYW1vdW50PUFtb3VudE1hdGguYWRkKGFtb3VudCxkZWx0YSxicmFuZCk7XG4gfVxuc3RhdGUucmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpPT09MHx8XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YCk7XG5cbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UHVyc2VLaW5kKHZpdmlmeVB1cnNlS2luZCk7XG5oYXJkZW4odml2aWZ5UHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQdXJzZUtpbmQiOlsidml2aWZ5UHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN7bNaX7BQAA+wUAAC0AAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJvdmlkZUxhenksbWFrZU5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3QgICAgICAgIG1ha2VUcmFuc2llbnROb3RpZmllcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHM9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbid0cmFuc2llbnROb3RpZmVyS2l0cycpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcktpdD0oa2V5KT0+XG5wcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cyxrZXksKCk9PlxubWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXI9KGtleSk9PnByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuY29uc3QgdXBkYXRlPShrZXksbmV3VmFsdWUpPT57XG5pZih0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSl7XG5jb25zdHt1cGRhdGVyfT10cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbnVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuIH1cbiB9O1xuXG5yZXR1cm57cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2mTG2hiYAAIYmAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIEJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjigI1fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclNoYXBlPU0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaOKAjV9vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbmNvbnN0ICAgICAgICBQYXltZW50U2hhcGU9TS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaOKAjV9vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuY29uc3QgICAgICAgIFB1cnNlU2hhcGU9TS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjigI1fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuY29uc3QgICAgICAgIERlcG9zaXRGYWNldFNoYXBlPU0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaOKAjV9vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbmNvbnN0IE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7XG5jb25zdCAgICAgICAgTWludFNoYXBlPU0ucmVtb3RhYmxlKCdNaW50Jyk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIE5hdFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXNcbiAqIGEgbm9uLW5lZ2F0aXZlIGJpZ2ludCwgdGhlbiBpdCByZXByZXNlbnRzIHRoYXQgbWFueSB1bml0cyBvZiB0aGVcbiAqIGZ1bmdpYmxlIGFzc2V0IHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50LiBUaGUgYnJhbmQgb2YgdGhhdCBhbW91bnRcbiAqIHNob3VsZCBpbmRlZWQgcmVwcmVzZW50IGEga2luZCBvZiBhc3NldCBjb25zaXN0aW5nIG9mIGEgY291bnRhYmxlXG4gKiBzZXQgb2YgZnVuZ2libGUgdW5pdHMuXG4gKi8kaOKAjV9vbmNlLk1pbnRTaGFwZShNaW50U2hhcGUpO1xuY29uc3QgTmF0VmFsdWVTaGFwZT1NLm5hdCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5U2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5U2V0LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aG9zZVxuICoga2V5cywgd2hlcmUgZWFjaCBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgbm9uLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIG5vbi1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIHNldCBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZT1NLnNldCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlBcnJheSBvZiBwYXNzYWJsZSBLZXlzLiBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGRlcHJlY2F0ZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiBDb3B5U2V0VmFsdWVzLlxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weUJhZ1ZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUJhZywgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBiYWcgKG11bHRpc2V0KSBvZiB0aG9zZVxuICoga2V5cywgd2hlcmUgZWFjaCBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgc2VtaS1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBzZW1pLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQga2V5XG4gKiBhcHBlYXJzIGluIHRoZSBiYWcgaXMgdGhlIG51bWJlciBvZiBmdW5naWJsZSB1bml0cyBvZiB0aGF0IGtleS5cbiAqIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weUJhZ1ZhbHVlU2hhcGU9TS5iYWcoKTtcblxuY29uc3QgQW1vdW50VmFsdWVTaGFwZT1NLm9yKFxuTmF0VmFsdWVTaGFwZSxcbkNvcHlTZXRWYWx1ZVNoYXBlLFxuU2V0VmFsdWVTaGFwZSxcbkNvcHlCYWdWYWx1ZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgQW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kOkJyYW5kU2hhcGUsXG52YWx1ZTpBbW91bnRWYWx1ZVNoYXBlfSk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBOYXQgYmlnaW50LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgWGltcG9ydCgnLi90eXBlcy5qcycpLk5hdFZhbHVlfVxuICovJGjigI1fb25jZS5BbW91bnRTaGFwZShBbW91bnRTaGFwZSk7XG5jb25zdCAgICAgICAgaXNOYXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLE5hdFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnVmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWdWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlCYWdWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weUJhZ1ZhbHVlKGlzQ29weUJhZ1ZhbHVlKTtcbmhhcmRlbihpc0NvcHlCYWdWYWx1ZSk7XG5cbi8qIE9uZSBHT09HT0x0aCBzaG91bGQgYmUgZW5vdWdoIGRlY2ltYWwgcGxhY2VzIGZvciBhbnlib2R5LiovXG5jb25zdCAgICAgICAgTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTPTEwMDskaOKAjV9vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG5jb25zdCAgICAgICAgQXNzZXRLaW5kU2hhcGU9TS5vcignbmF0Jywnc2V0JywnY29weVNldCcsJ2NvcHlCYWcnKTskaOKAjV9vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuY29uc3QgICAgICAgIERpc3BsYXlJbmZvU2hhcGU9TS5zcGxpdFJlY29yZChcbnt9LFxue1xuZGVjaW1hbFBsYWNlczpNLmFuZChcbk0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSksXG5cbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntcbi8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbi8qIHByb3BlcnRpZXMgYmV5b25kIHRob3NlIGluIHRoZSBgYmFzZWAgcmVjb3JkLiovfSk7XG5cblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRJPU0uaW50ZXJmYWNlKCdCcmFuZCcse1xuaXNNeUlzc3VlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuZ2V0QW1vdW50U2hhcGU6TS5jYWxsKCkucmV0dXJucyhNLnBhdHRlcm4oKSl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjigI1fb25jZS5CcmFuZEkoQnJhbmRJKTtcbmNvbnN0ICAgICAgICBtYWtlSXNzdWVySW50ZXJmYWNlcz0oXG5icmFuZFNoYXBlPUJyYW5kU2hhcGUsXG5hc3NldEtpbmRTaGFwZT1Bc3NldEtpbmRTaGFwZSxcbmFtb3VudFNoYXBlPUFtb3VudFNoYXBlKT0+XG57XG5jb25zdCBJc3N1ZXJJPU0uaW50ZXJmYWNlKCdJc3N1ZXInLHtcbmdldEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0QXNzZXRLaW5kOk0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbm1ha2VFbXB0eVB1cnNlOk0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbmlzTGl2ZTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbW91bnRPZjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5idXJuOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoYW1vdW50U2hhcGUpLFxuY2xhaW06TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhQYXltZW50U2hhcGUpLFxuY29tYmluZTpNLmNhbGwoTS5hcnJheU9mKE0uZXJlZihQYXltZW50U2hhcGUpKSkuXG5vcHRpb25hbChhbW91bnRTaGFwZSkuXG5yZXR1cm5zKE0uZXJlZihQYXltZW50U2hhcGUpKSxcbnNwbGl0Ok0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpLGFtb3VudFNoYXBlKS5yZXR1cm5zKFxuTS5hcnJheU9mKFBheW1lbnRTaGFwZSkpLFxuXG5zcGxpdE1hbnk6TS5jYWxsV2hlbihcbk0uYXdhaXQoUGF5bWVudFNoYXBlKSxcbk0uYXJyYXlPZihhbW91bnRTaGFwZSkpLlxucmV0dXJucyhNLmFycmF5T2YoUGF5bWVudFNoYXBlKSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAArg3H76UIAAOlCAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldFZhbHVlIHwgQ29weUJhZ1ZhbHVlfSBBbW91bnRWYWx1ZVxuICogQW4gYEFtb3VudFZhbHVlYCBkZXNjcmliZXMgYSBzZXQgb3IgcXVhbnRpdHkgb2YgYXNzZXRzIHRoYXQgY2FuIGJlIG93bmVkIG9yXG4gKiBzaGFyZWQuXG4gKlxuICogQSBmdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYSBub24tbmVnYXRpdmUgYmlnaW50IHRvIHJlcHJlc2VudCBhIHF1YW50aXR5XG4gKiBvZiB0aGF0IG1hbnkgYXNzZXRzLlxuICpcbiAqIEEgbm9uLWZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhbiBhcnJheSBvciBDb3B5U2V0IG9mIGBLZXlgcyB0byByZXByZXNlbnRcbiAqIGEgc2V0IG9mIHdoYXRldmVyIGFzc2V0IGVhY2gga2V5IHJlcHJlc2VudHMuIEEgYEtleWAgaXMgYSBwYXNzYWJsZSB2YWx1ZVxuICogdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBlbGVtZW50IGluIGEgc2V0IChTZXRTdG9yZSBvciBDb3B5U2V0KSBvciBhcyB0aGVcbiAqIGtleSBpbiBhIG1hcCAoTWFwU3RvcmUgb3IgQ29weU1hcCkuXG4gKlxuICogYFNldFZhbHVlYCBpcyBmb3IgdGhlIGRlcHJlY2F0ZWQgc2V0IHJlcHJlc2VudGF0aW9uLCB1c2luZyBhbiBhcnJheSBkaXJlY3RseVxuICogdG8gcmVwcmVzZW50IHRoZSBhcnJheSBvZiBpdHMgZWxlbWVudHMuIGBDb3B5U2V0VmFsdWVgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdWYWx1ZWAgaXMgcmVwcmVzZW50ZWQgYXMgYVxuICogYENvcHlCYWdgIG9mIGBLZXlgIG9iamVjdHMuIFwiQmFnXCIgaXMgc3lub255bW91cyB3aXRoIE11bHRpU2V0LCB3aGVyZSBhblxuICogZWxlbWVudCBvZiBhIGJhZyBjYW4gYmUgcHJlc2VudCBvbmNlIG9yIG1vcmUgdGltZXMsIGkuZS4sIHNvbWUgcG9zaXRpdmVcbiAqIGJpZ2ludCBudW1iZXIgb2YgdGltZXMsIHJlcHJlc2VudGluZyB0aGF0IHF1YW50aXR5IG9mIHRoZSBhc3NldCByZXByZXNlbnRlZFxuICogYnkgdGhhdCBrZXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJyB9IEFzc2V0S2luZFxuICpcbiAqIFNlZSBkb2MtY29tbWVudCBmb3IgYEFtb3VudFZhbHVlYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7SyBleHRlbmRzICduYXQnID8gTmF0VmFsdWUgOlxuICogSyBleHRlbmRzICdzZXQnID8gU2V0VmFsdWUgOlxuICogSyBleHRlbmRzICdjb3B5U2V0JyA/IENvcHlTZXRWYWx1ZTpcbiAqIEsgZXh0ZW5kcyAnY29weUJhZycgPyBDb3B5QmFnVmFsdWUgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0VmFsdWUgPyAnY29weVNldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5QmFnVmFsdWUgPyAnY29weUJhZycgOlxuICogIG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcj19IGRlY2ltYWxQbGFjZXMgVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kIC0gdGhlIGtpbmQgb2YgYXNzZXQsIGVpdGhlclxuICogICBBc3NldEtpbmQuTkFUIChmdW5naWJsZSkgb3JcbiAqICAgQXNzZXRLaW5kLlNFVCBvciBBc3NldEtpbmQuQ09QWV9TRVQgKG5vbi1mdW5naWJsZSlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcmFuZFxuICogVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZVxuICogYWxsZWdlZCBuYW1lIGZvciB0aGUga2luZCBvZiBhc3NldCBkZXNjcmliZWQuIFRoZSBhbGxlZ2VkIG5hbWUgKHN1Y2hcbiAqIGFzICdCVEMnIG9yICdtb29sYScpIGlzIHByb3ZpZGVkIGJ5IHRoZSBtYWtlciBvZiB0aGUgaXNzdWVyIGFuZCBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqIEV2ZXJ5IGFtb3VudCBjcmVhdGVkIGJ5IGEgcGFydGljdWxhciBBbW91bnRNYXRoIHdpbGwgc2hhcmUgdGhlIHNhbWUgYnJhbmQsXG4gKiBidXQgcmVjaXBpZW50cyBjYW5ub3QgcmVseSBvbiB0aGUgYnJhbmQgdG8gdmVyaWZ5IHRoYXQgYSBwdXJwb3J0ZWQgYW1vdW50XG4gKiByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogYSBtaXNiZWhhdmluZyBpc3N1ZXIuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZElzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPGJvb2xlYW4+fSBpc015SXNzdWVyXG4gKiBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mb1xuICogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBQYXR0ZXJufSBnZXRBbW91bnRTaGFwZVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJc3N1ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVySXNMaXZlXG4gKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2ZcbiAqXG4gKiBHZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC4gQmVjYXVzZSB0aGVcbiAqIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LCBhbmRcbiAqIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckJ1cm5cbiAqXG4gKiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50LiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXMgcHJlc2VudCwgdGhlXG4gKiBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudD59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNsYWltXG4gKlxuICogVHJhbnNmZXIgYWxsIGRpZ2l0YWwgYXNzZXRzIGZyb20gdGhlIHBheW1lbnQgdG8gYSBuZXcgcGF5bWVudCBhbmRcbiAqIGRlbGV0ZSB0aGUgb3JpZ2luYWwuIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpc1xuICogcHJlc2VudCwgdGhlIGNvZGUgd2lsbCBpbnNpc3QgdGhhdCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluXG4gKiB0aGUgcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ29tYmluZVxuICpcbiAqIENvbWJpbmUgbXVsdGlwbGUgcGF5bWVudHMgaW50byBvbmUgcGF5bWVudC5cbiAqXG4gKiBJZiBhbnkgb2YgdGhlIHBheW1lbnRzIGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWRcbiAqIHVwb24gcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj5bXX0gcGF5bWVudHNBcnJheVxuICogQHBhcmFtIHtBbW91bnQ8Sz49fSBvcHRUb3RhbEFtb3VudFxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlclNwbGl0XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIHR3byBwYXltZW50cyxcbiAqIEEgYW5kIEIsIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnlcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gbWFueSBwYXltZW50cywgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnRzXG4gKiBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyXG4gKlxuICogVGhlIGlzc3VlciBjYW5ub3QgbWludCBhIG5ldyBhbW91bnQsIGJ1dCBpdCBjYW4gY3JlYXRlIGVtcHR5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGUgaXNzdWVyIGNhbiBhbHNvIHRyYW5zZm9ybSBwYXltZW50cyAoc3BsaXR0aW5nXG4gKiBwYXltZW50cywgY29tYmluaW5nIHBheW1lbnRzLCBidXJuaW5nIHBheW1lbnRzLCBhbmQgY2xhaW1pbmdcbiAqIHBheW1lbnRzIGV4Y2x1c2l2ZWx5KS4gVGhlIGlzc3VlciBzaG91bGQgYmUgZ290dGVuIGZyb20gYSB0cnVzdGVkXG4gKiBzb3VyY2UgYW5kIHRoZW4gcmVsaWVkIHVwb24gYXMgdGhlIGRlY2lkZXIgb2Ygd2hldGhlciBhbiB1bnRydXN0ZWRcbiAqIHBheW1lbnQgaXMgdmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmQgR2V0IHRoZSBCcmFuZCBmb3IgdGhpcyBJc3N1ZXIuIFRoZVxuICogQnJhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgYW5kIGlzIHNoYXJlZCBieSB0aGVcbiAqIG1pbnQsIHRoZSBpc3N1ZXIsIGFuZCBhbnkgcHVyc2VzIGFuZCBwYXltZW50cyBvZiB0aGlzIHBhcnRpY3VsYXJcbiAqIGtpbmQuIFRoZSBicmFuZCBpcyBub3QgY2xvc2VseSBoZWxkLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmVcbiAqIHRydXN0ZWQgdG8gaWRlbnRpZnkgYW4gaXNzdWVyIGFsb25lLiBGYWtlIGRpZ2l0YWwgYXNzZXRzIGFuZCBhbW91bnRcbiAqIGNhbiB1c2UgYW5vdGhlciBpc3N1ZXIncyBicmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWUgR2V0IHRoZSBhbGxlZ2VkTmFtZSBmb3JcbiAqIHRoaXMgbWludC9pc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXNzZXRLaW5kfSBnZXRBc3NldEtpbmQgR2V0IHRoZSBraW5kIG9mXG4gKiBNYXRoSGVscGVycyB1c2VkIGJ5IHRoaXMgSXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mb30gZ2V0RGlzcGxheUluZm8gR2l2ZSBpbmZvcm1hdGlvbiB0byBVSVxuICogIG9uIGhvdyB0byBkaXNwbGF5IGFtb3VudHMgZm9yIHRoaXMgaXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBQdXJzZTxLPn0gbWFrZUVtcHR5UHVyc2UgTWFrZSBhbiBlbXB0eSBwdXJzZSBvZiB0aGlzXG4gKiBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVySXNMaXZlfSBpc0xpdmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyR2V0QW1vdW50T2Y8Sz59IGdldEFtb3VudE9mXG4gKiBAcHJvcGVydHkge0lzc3VlckJ1cm59IGJ1cm5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQ2xhaW08Sz59IGNsYWltXG4gKiBAcHJvcGVydHkge0lzc3VlckNvbWJpbmU8Sz59IGNvbWJpbmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyU3BsaXQ8Sz59IHNwbGl0XG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0TWFueX0gc3BsaXRNYW55XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudExlZGdlclxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlcktpdFxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZGl0aW9uYWxEaXNwbGF5SW5mb1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyPX0gZGVjaW1hbFBsYWNlcyBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtBc3NldEtpbmQ9fSBhc3NldEtpbmRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBDYWxsZWQgdG8gc2h1dCBzb21ldGhpbmcgZG93biBiZWNhdXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLCB3aGVyZSB0aGUgcmVhc29uXG4gKiBpcyBzdXBwb3NlZCB0byBiZSBhbiBFcnJvciB0aGF0IGRlc2NyaWJlcyB3aGF0IHdlbnQgd3JvbmcuIFNvbWUgdmFsaWRcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgU2h1dGRvd25XaXRoRmFpbHVyZWAgd2lsbCBuZXZlciByZXR1cm4sIGVpdGhlclxuICogYmVjYXVzZSB0aGV5IHRocm93IG9yIGJlY2F1c2UgdGhleSBpbW1lZGlhdGVseSBzaHV0ZG93biB0aGUgZW5jbG9zaW5nIHVuaXRcbiAqIG9mIGNvbXB1dGF0aW9uLiBIb3dldmVyLCB0aGV5IGFsc28gbWlnaHQgcmV0dXJuLCBzbyB0aGUgY2FsbGVyIHNob3VsZFxuICogZm9sbG93IHRoaXMgY2FsbCBieSB0aGVpciBvd24gZGVmZW5zaXZlIGB0aHJvdyByZWFzb247YCBpZiBhcHByb3ByaWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1pbnRcbiAqIEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsIGFzc2V0cy4gVGhlc2VcbiAqIGFzc2V0cyBhbGwgaGF2ZSB0aGUgc2FtZSBraW5kLCB3aGljaCBpcyBjYWxsZWQgYSBCcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyIEdldHMgdGhlIElzc3VlciBmb3IgdGhpcyBtaW50LlxuICogQHByb3BlcnR5IHsobmV3QW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IG1pbnRQYXltZW50XG4gKiBDcmVhdGVzIGEgbmV3IFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZXBvc2l0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7RGVwb3NpdEZhY2V0UmVjZWl2ZX0gcmVjZWl2ZVxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGUgcHVyc2UgdGhhdCBtYWRlIHRoaXMgZmFjZXQsXG4gKiByZXR1cm5pbmcgdGhlIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIFB1cnNlRGVwb3NpdFxuICogQHBhcmFtIHtQYXltZW50PEs+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdXJzZVxuICogUHVyc2VzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kLCBidXQgdW5saWtlIFBheW1lbnRzLFxuICogdGhleSBhcmUgbm90IG1lYW50IHRvIGJlIHNlbnQgdG8gb3RoZXJzLiBUbyB0cmFuc2ZlciBkaWdpdGFsIGFzc2V0cywgYVxuICogUGF5bWVudCBzaG91bGQgYmUgd2l0aGRyYXduIGZyb20gYSBQdXJzZS4gVGhlIGFtb3VudCBvZiBkaWdpdGFsXG4gKiBhc3NldHMgaW4gYSBwdXJzZSBjYW4gY2hhbmdlIHRocm91Z2ggdGhlIGFjdGlvbiBvZiBkZXBvc2l0KCkgYW5kIHdpdGhkcmF3KCkuXG4gKlxuICogVGhlIHByaW1hcnkgdXNlIGZvciBQdXJzZXMgYW5kIFBheW1lbnRzIGlzIGZvciBjdXJyZW5jeS1saWtlIGFuZCBnb29kcy1saWtlXG4gKiBkaWdpdGFsIGFzc2V0cywgYnV0IHRoZXkgY2FuIGFsc28gYmUgdXNlZCB0byByZXByZXNlbnQgb3RoZXIga2luZHMgb2YgcmlnaHRzLFxuICogc3VjaCBhcyB0aGUgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGNvbnRyYWN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZCBHZXQgdGhlIGFsbGVnZWQgQnJhbmQgZm9yIHRoaXMgUHVyc2VcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gZ2V0Q3VycmVudEFtb3VudFxuICogR2V0IHRoZSBhbW91bnQgY29udGFpbmVkIGluIHRoaXMgcHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBOb3RpZmllcjxBbW91bnQ8Sz4+fSBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXJcbiAqIEdldCBhIGxvc3N5IG5vdGlmaWVyIGZvciBjaGFuZ2VzIHRvIHRoaXMgcHVyc2UncyBiYWxhbmNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7UHVyc2VEZXBvc2l0PEs+fSBkZXBvc2l0XG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoaXMgcHVyc2UsIHJldHVybmluZyB0aGVcbiAqIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBEZXBvc2l0RmFjZXR9IGdldERlcG9zaXRGYWNldFxuICogUmV0dXJuIGFuIG9iamVjdCB3aG9zZSBgcmVjZWl2ZWAgbWV0aG9kIGRlcG9zaXRzIHRvIHRoZSBjdXJyZW50IFB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSB3aXRoZHJhd1xuICogV2l0aGRyYXcgYW1vdW50IGZyb20gdGhpcyBwdXJzZSBpbnRvIGEgbmV3IFBheW1lbnQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBDb3B5U2V0PFBheW1lbnQ8Sz4+fSBnZXRSZWNvdmVyeVNldFxuICogVGhlIHNldCBvZiBwYXltZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwdXJzZSB0aGF0IGFyZSBzdGlsbCBsaXZlLiBUaGVzZVxuICogYXJlIHRoZSBwYXltZW50cyB0aGF0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gZW1lcmdlbmNpZXMgYnksIGZvciBleGFtcGxlLFxuICogZGVwb3NpdGluZyBpbnRvIHRoaXMgcHVyc2UuIFN1Y2ggYSBkZXBvc2l0IGFjdGlvbiBpcyBsaWtlIGNhbmNlbGluZyBhblxuICogb3V0c3RhbmRpbmcgY2hlY2sgYmVjYXVzZSB5b3UncmUgdGlyZWQgb2Ygd2FpdGluZyBmb3IgaXQuIE9uY2UgeW91clxuICogY2FuY2VsbGF0aW9uIGlzIGFja25vd2xlZGdlZCwgeW91IGNhbiBzcGVuZCB0aGUgYXNzZXRzIGF0IHN0YWtlIG9uIG90aGVyXG4gKiB0aGluZ3MuIEFmdGVyd2FyZHMsIGlmIHRoZSByZWNpcGllbnQgb2YgdGhlIG9yaWdpbmFsIGNoZWNrIGZpbmFsbHkgZ2V0c1xuICogYXJvdW5kIHRvIGRlcG9zaXRpbmcgaXQsIHRoZWlyIGRlcG9zaXQgZmFpbHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IHJlY292ZXJBbGxcbiAqIEZvciB1c2UgaW4gZW1lcmdlbmNpZXMsIHN1Y2ggYXMgY29taW5nIGJhY2sgZnJvbSBhIHRyYXVtYXRpYyBjcmFzaCBhbmRcbiAqIHVwZ3JhZGUuIFRoaXMgZGVwb3NpdHMgYWxsIHRoZSBwYXltZW50cyBpbiB0aGlzIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0XG4gKiBpbnRvIHRoZSBwdXJzZSBpdHNlbGYsIHJldHVybmluZyB0aGUgdG90YWwgYW1vdW50IG9mIGFzc2V0cyByZWNvdmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudFxuICogUGF5bWVudHMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQgaW4gdHJhbnNpdC4gUGF5bWVudHNcbiAqIGNhbiBiZSBkZXBvc2l0ZWQgaW4gcHVyc2VzLCBzcGxpdCBpbnRvIG11bHRpcGxlIHBheW1lbnRzLCBjb21iaW5lZCwgYW5kXG4gKiBjbGFpbWVkIChnZXR0aW5nIGFuIGV4Y2x1c2l2ZSBwYXltZW50KS4gUGF5bWVudHMgYXJlIGxpbmVhciwgbWVhbmluZ1xuICogdGhhdCBlaXRoZXIgYSBwYXltZW50IGhhcyB0aGUgc2FtZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaXRcbiAqIHN0YXJ0ZWQgd2l0aCwgb3IgaXQgaXMgdXNlZCB1cCBlbnRpcmVseS4gSXQgaXMgaW1wb3NzaWJsZSB0byBwYXJ0aWFsbHkgdXNlIGFcbiAqIHBheW1lbnQuXG4gKlxuICogUGF5bWVudHMgYXJlIG9mdGVuIHJlY2VpdmVkIGZyb20gb3RoZXIgYWN0b3JzIGFuZCB0aGVyZWZvcmUgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCB0aGVtc2VsdmVzLiBUbyBnZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiBhIHBheW1lbnQsXG4gKiB1c2UgdGhlIHRydXN0ZWQgaXNzdWVyOiBpc3N1ZXIuZ2V0QW1vdW50T2YocGF5bWVudCksXG4gKlxuICogUGF5bWVudHMgY2FuIGJlIGNvbnZlcnRlZCB0byBQdXJzZXMgYnkgZ2V0dGluZyBhIHRydXN0ZWQgaXNzdWVyIGFuZFxuICogY2FsbGluZyBgaXNzdWVyLm1ha2VFbXB0eVB1cnNlKClgIHRvIGNyZWF0ZSBhIHB1cnNlLCB0aGVuXG4gKiBgcHVyc2UuZGVwb3NpdChwYXltZW50KWAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kXG4gKiBHZXQgdGhlIGFsbGVnZWRCcmFuZCwgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IHRoaXNcbiAqIHBheW1lbnQgcHVycG9ydHMgdG8gYmUsIGFuZCB3aGljaCBpc3N1ZXIgdG8gdXNlLiBCZWNhdXNlIHBheW1lbnRzXG4gKiBhcmUgbm90IHRydXN0ZWQsIGFueSBtZXRob2QgY2FsbHMgb24gcGF5bWVudHMgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIHdpdGggc3VzcGljaW9uIGFuZCB2ZXJpZmllZCBlbHNld2hlcmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRoSGVscGVyc1xuICogQWxsIG9mIHRoZSBkaWZmZXJlbmNlIGluIGhvdyBkaWdpdGFsIGFzc2V0IGFtb3VudCBhcmUgbWFuaXB1bGF0ZWQgY2FuIGJlXG4gKiByZWR1Y2VkIHRvIHRoZSBiZWhhdmlvciBvZiB0aGUgbWF0aCBvbiB2YWx1ZXMuIFdlIGV4dHJhY3QgdGhpc1xuICogY3VzdG9tIGxvZ2ljIGludG8gbWF0aEhlbHBlcnMuIE1hdGhIZWxwZXJzIGFyZSBhYm91dCB2YWx1ZVxuICogYXJpdGhtZXRpYywgd2hlcmVhcyBBbW91bnRNYXRoIGlzIGFib3V0IGFtb3VudHMsIHdoaWNoIGFyZSB0aGVcbiAqIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCB1c2UgbWF0aEhlbHBlcnMgdG8gZG8gdGhlaXIgdmFsdWVcbiAqIGFyaXRobWV0aWMsIGFuZCB0aGVuIGJyYW5kIHRoZSByZXN1bHRzLCBtYWtpbmcgYSBuZXcgYW1vdW50LlxuICpcbiAqIFRoZSBNYXRoSGVscGVycyBhcmUgZGVzaWduZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSBBbW91bnRNYXRoLCBhbmQgc29cbiAqIGFsbCBtZXRob2RzIGJ1dCBjb2VyY2UgY2FuIGFzc3VtZSB0aGVpciBpbnB1dHMgYXJlIHZhbGlkLiBUaGV5IG9ubHlcbiAqIG5lZWQgdG8gZG8gb3V0cHV0IHZhbGlkYXRpb24sIGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZlxuICogaW52YWxpZCBvdXRwdXQuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFZhbHVlOiBWKSA9PiBWfSBkb0NvZXJjZVxuICogQ2hlY2sgdGhlIGtpbmQgb2YgdGhpcyB2YWx1ZSBhbmQgdGhyb3cgaWYgaXQgaXMgbm90IHRoZVxuICogZXhwZWN0ZWQga2luZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFZ9IGRvTWFrZUVtcHR5XG4gKiBHZXQgdGhlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgaWRlbnRpdHkgZWxlbWVudCAob2Z0ZW4gMCBvciBhblxuICogZW1wdHkgYXJyYXkpXG4gKlxuICogQHByb3BlcnR5IHsodmFsdWU6IFYpID0+IGJvb2xlYW59IGRvSXNFbXB0eVxuICogSXMgdGhlIHZhbHVlIHRoZSBpZGVudGl0eSBlbGVtZW50P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzR1RFXG4gKiBJcyB0aGUgbGVmdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzRXF1YWxcbiAqIERvZXMgbGVmdCBlcXVhbCByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9BZGRcbiAqIFJldHVybiB0aGUgbGVmdCBjb21iaW5lZCB3aXRoIHRoZSByaWdodC5cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9TdWJ0cmFjdFxuICogUmV0dXJuIHdoYXQgcmVtYWlucyBhZnRlciByZW1vdmluZyB0aGUgcmlnaHQgZnJvbSB0aGUgbGVmdC4gSWZcbiAqIHNvbWV0aGluZyBpbiB0aGUgcmlnaHQgd2FzIG5vdCBpbiB0aGUgbGVmdCwgd2UgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YmlnaW50fSBOYXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPE5hdFZhbHVlPn0gTmF0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPFNldFZhbHVlPn0gU2V0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5U2V0PEtleT59IENvcHlTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPENvcHlTZXRWYWx1ZT59IENvcHlTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlCYWc8S2V5Pn0gQ29weUJhZ1ZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weUJhZ1ZhbHVlPn0gQ29weUJhZ01hdGhIZWxwZXJzXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApY/07oUEAACFBAAAMAAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvbWFrZVRyYWNlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG5jb25zdCBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7YWNthA0AAIQNAABDAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92YXVsdEZhY3RvcnkvbGlxdWlkYXRlTWluaW11bS5qc3siaW1wb3J0cyI6WyIuLi9tYWtlVHJhY2VyLmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxjZWlsTXVsdGlwbHlCeSxvZmZlclRvLEFtb3VudE1hdGgsRmFyLG1ha2VUcmFjZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJjZWlsTXVsdGlwbHlCeVwiLCBbJGjigI1fYSA9PiAoY2VpbE11bHRpcGx5QnkgPSAkaOKAjV9hKV1dLFtcIm9mZmVyVG9cIiwgWyRo4oCNX2EgPT4gKG9mZmVyVG8gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4uL21ha2VUcmFjZXIuanNcIiwgW1tcIm1ha2VUcmFjZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VUcmFjZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHRyYWNlPW1ha2VUcmFjZXIoJ0xpcU1pbicsZmFsc2UpO1xuXG4vKipcbiAqIFRoaXMgY29udHJhY3QgbGlxdWlkYXRlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgdmF1bHQncyBjb2xsYXRlcmFsIG5lY2Vzc2FyeVxuICogdG8gc2F0aXNmeSB0aGUgZGVidC4gSXQgdXNlcyB0aGUgQU1NJ3Mgc3dhcE91dCwgd2hpY2ggc2VsbHMgbm8gbW9yZSB0aGFuXG4gKiBuZWNlc3NhcnkuIEJlY2F1c2UgaXQgaGFzIG9mZmVyIHNhZmV0eSwgaXQgY2FuIHJlZnVzZSB0aGUgdHJhZGUuIFdoZW4gdGhhdFxuICogaGFwcGVucywgd2UgZmFsbCBiYWNrIHRvIHNlbGxpbmcgdXNpbmcgdGhlIGRlZmF1bHQgc3RyYXRlZ3ksIHdoaWNoIGN1cnJlbnRseVxuICogdXNlcyB0aGUgQU1NJ3Mgc3dhcEluIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtaQ0Y8e1xuICogICBhbW06IFhZS0FNTVB1YmxpY0ZhY2V0LFxuICogfT59IHpjZlxuICovXG5jb25zdCBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdHthbW19PXpjZi5nZXRUZXJtcygpO1xudHJhY2UoJ3N0YXJ0Jyx6Y2YuZ2V0VGVybXMoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBkZWJ0b3JTZWF0XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBvcHRpb25zLmRlYnQgRGVidCBiZWZvcmUgcGVuYWx0aWVzXG4gKiBAcGFyYW0ge1JhdGlvfSBvcHRpb25zLnBlbmFsdHlSYXRlXG4gKi9cbmNvbnN0IGhhbmRsZUxpcXVpZGF0aW9uT2ZmZXI9YXN5bmMoXG5kZWJ0b3JTZWF0LFxue2RlYnQ6b3JpZ2luYWxEZWJ0LHBlbmFsdHlSYXRlfSk9Plxue1xuLyogWFhYIGRvZXMgbm90IGRpc3RyaWJ1dGUgcGVuYWx0aWVzIGFueXdoZXJlKi9cbmNvbnN0e3pjZlNlYXQ6cGVuYWx0eVBvb2xTZWF0fT16Y2YubWFrZUVtcHR5U2VhdEtpdCgpO1xuY29uc3QgcGVuYWx0eT1jZWlsTXVsdGlwbHlCeShvcmlnaW5hbERlYnQscGVuYWx0eVJhdGUpO1xuY29uc3QgZGVidFdpdGhQZW5hbHR5PUFtb3VudE1hdGguYWRkKG9yaWdpbmFsRGVidCxwZW5hbHR5KTtcbmNvbnN0IGRlYnRCcmFuZD1vcmlnaW5hbERlYnQuYnJhbmQ7XG5jb25zdHtcbmdpdmU6e0luOmFtb3VudElufX09XG5kZWJ0b3JTZWF0LmdldFByb3Bvc2FsKCk7XG5cbmNvbnN0IHN3YXBJbnZpdGF0aW9uPUUoYW1tKS5tYWtlU3dhcEludml0YXRpb24oKTtcbmNvbnN0IGxpcVByb3Bvc2FsPWhhcmRlbih7XG5naXZlOntJbjphbW91bnRJbn0sXG53YW50OntPdXQ6QW1vdW50TWF0aC5tYWtlRW1wdHkoZGVidEJyYW5kKX19KTtcblxudHJhY2UoIGBPRkZFUiBUTyBERUJUOiBgLGRlYnRXaXRoUGVuYWx0eSxhbW91bnRJbik7XG5jb25zdHtkZXBvc2l0ZWR9PWF3YWl0IG9mZmVyVG8oXG56Y2YsXG5zd2FwSW52aXRhdGlvbixcbnVuZGVmaW5lZCwvKiBUaGUga2V5d29yZHMgd2VyZSBtYXBwZWQgYWxyZWFkeSovXG5saXFQcm9wb3NhbCxcbmRlYnRvclNlYXQsXG5kZWJ0b3JTZWF0LFxue3N0b3BBZnRlcjpkZWJ0V2l0aFBlbmFsdHl9KTtcblxuY29uc3QgYW1vdW50cz1hd2FpdCBkZXBvc2l0ZWQ7XG50cmFjZSggYExpcSByZXN1bHRzYCx7XG5kZWJ0V2l0aFBlbmFsdHksXG5hbW91bnRJbixcbnBhaWQ6ZGVidG9yU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpLFxuYW1vdW50c30pO1xuXG5cbi8qIE5vdyB3ZSBuZWVkIHRvIGtub3cgaG93IG11Y2ggd2FzIHNvbGQgc28gd2UgY2FuIHBheSBvZmYgdGhlIGRlYnQuKi9cbi8qIFdlIGNhbiB1c2UgdGhpcyBzZWF0IGJlY2F1c2Ugb25seSBsaXF1aWRhdGlvbiBhZGRzIGRlYnQgYnJhbmQgdG8gaXQuLiovXG5jb25zdCBkZWJ0UGFpZD1kZWJ0b3JTZWF0LmdldEFtb3VudEFsbG9jYXRlZCgnT3V0JyxkZWJ0QnJhbmQpO1xuY29uc3QgcGVuYWx0eVBhaWQ9QW1vdW50TWF0aC5taW4ocGVuYWx0eSxkZWJ0UGFpZCk7XG5cbi8qIEFsbG9jYXRlIHBlbmFsdHkgcG9ydGlvbiBvZiBwcm9jZWVkcyB0byBhIHNlYXQgdGhhdCB3aWxsIGhvbGQgaXQgZm9yIHRyYW5zZmVyIHRvIHJlc2VydmUqL1xucGVuYWx0eVBvb2xTZWF0LmluY3JlbWVudEJ5KFxuZGVidG9yU2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oe091dDpwZW5hbHR5UGFpZH0pKSk7XG5cbnpjZi5yZWFsbG9jYXRlKHBlbmFsdHlQb29sU2VhdCxkZWJ0b3JTZWF0KTtcblxuZGVidG9yU2VhdC5leGl0KCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7RVJlZjxMaXF1aWRhdG9yPn1cbiAqL1xuY29uc3QgY3JlYXRvckZhY2V0PUZhcignZGVidG9ySW52aXRhdGlvbkNyZWF0b3IgKG1pbmltdW0pJyx7XG5tYWtlTGlxdWlkYXRlSW52aXRhdGlvbjooKT0+XG56Y2YubWFrZUludml0YXRpb24oaGFuZGxlTGlxdWlkYXRpb25PZmZlciwnTGlxdWlkYXRlJyl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtjcmVhdG9yRmFjZXR9KTtcbiB9O1xuXG4vKiogQHR5cGVkZWYge0NvbnRyYWN0T2Y8dHlwZW9mIHN0YXJ0Pn0gTGlxdWlkYXRpb25Db250cmFjdCAqLyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xuXG5oYXJkZW4oc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADTZ0itoBAAAaAQAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvY29uZmlnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIldhbGxldE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiogQGZpbGVcbiAqXG4gKiBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCBhbmQgb3VyIGxheCBwYWNrYWdlXG4gKiBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb24gZXJyb3JzLlxuICpcbiAqIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKi9cbmNvbnN0ICAgICAgICBCcmlkZ2VJZD17XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcblBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6J3Byb3Zpc2lvbldhbGxldCcsXG5XQUxMRVQ6J3dhbGxldCd9OyRo4oCNX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuXG5oYXJkZW4oQnJpZGdlSWQpO1xuXG5jb25zdCAgICAgICAgV2FsbGV0TmFtZT17XG5kZXBvc2l0RmFjZXQ6J2RlcG9zaXRGYWNldCd9OyRo4oCNX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcblxuaGFyZGVuKFdhbGxldE5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyaWRnZUlkIjpbIkJyaWRnZUlkIl0sIldhbGxldE5hbWUiOlsiV2FsbGV0TmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACv9CbIfQEAAH0BAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi91dGlscy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdXRpbHMuanNcIiwgW11dLFtcIi4vY29uZmlnLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACtprWJjQAACY0AAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYXBwbHlMYWJlbGluZ0Vycm9yIiwiYmluZEFsbE1ldGhvZHMiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmcm9tVW5pcXVlRW50cmllcyIsImZzU3RyZWFtUmVhZHkiLCJnZXRNZXRob2ROYW1lcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3R5cGVzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuY29uc3R7b3duS2V5cyxhcHBseX09UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIFRocm93cyBpZiBtdWx0aXBsZSBlbnRyaWVzIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lLiBPdGhlcndpc2UgYWN0c1xuICogbGlrZSBgT2JqZWN0LmZyb21FbnRyaWVzYCBidXQgaGFyZGVucyB0aGUgcmVzdWx0LlxuICogVXNlIGl0IHRvIHByb3RlY3QgZnJvbSBwcm9wZXJ0eSBuYW1lcyBjb21wdXRlZCBmcm9tIHVzZXItcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLFZdPn0gYWxsRW50cmllc1xuICogQHJldHVybnMge3tbazogS106IFZ9fVxuICovXG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bmV3IFNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gbGVmdE5hbWVzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IHJpZ2h0TmFtZXNcbiAqL1xuY29uc3QgICAgICAgIGxpc3REaWZmZXJlbmNlPShsZWZ0TmFtZXMscmlnaHROYW1lcyk9PntcbmNvbnN0IHJpZ2h0U2V0PW5ldyBTZXQocmlnaHROYW1lcyk7XG5yZXR1cm4gbGVmdE5hbWVzLmZpbHRlcigobmFtZSk9PiFyaWdodFNldC5oYXMobmFtZSkpO1xuIH07JGjigI1fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIElmIHJlc3VsdCBpcyBhIHJlamVjdGVkIHByb21pc2UsIHRoaXMgd2lsbCovXG4vKiByZXR1cm4gYSBwcm9taXNlIHdpdGggYSBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMqL1xuLyogY29uZnVzZXMgVHlwZVNjcmlwdCBiZWNhdXNlIGl0IHR5cGVzIHRoYXQgY2FzZSBhcyBgUHJvbWlzZTxuZXZlcj5gKi9cbi8qIHdoaWNoIGlzIGNvb2wgZm9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgbmV2ZXIgZnVsZmxsLiovXG4vKiBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAqL1xuLyogc2hvdWxkIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbnJldHVybiBFLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+dGhyb3dMYWJlbGVkKHJlYXNvbixsYWJlbCkpO1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfTskaOKAjV9vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpe1xuLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbmlmKHR5cGVvZiB2YWxbbmFtZV09PT0nZnVuY3Rpb24nKXtcbm5hbWVzLmFkZChuYW1lKTtcbiB9XG4gfVxuaWYoIWlzT2JqZWN0KHZhbCkpe1xuYnJlYWs7XG4gfVxubGF5ZXI9Z2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuIH1cbnJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xuIH07JGjigI1fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKipcbiAqIFRPRE8gVGhpcyBmdW5jdGlvbiBleGlzdHMgb25seSB0byBlYXNlIHRoZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTk3MCB0cmFuc2l0aW9uLCBmcm9tIGFsbCBtZXRob2RzXG4gKiBiZWluZyBvd24gcHJvcGVydGllcyB0byBtZXRob2RzIGJlaW5nIGluaGVyaXRlZCBmcm9tIGEgY29tbW9uIHByb3RvdHlwZS5cbiAqIFRoaXMgdHJhbnNpdGlvbiBicmVha3MgdHdvIHBhdHRlcm5zIHVzZWQgaW4gcHJpb3IgY29kZTogYXV0b2JpbmRpbmcsXG4gKiBhbmQgZW51bWVyYXRpbmcgbWV0aG9kcyBieSBlbnVtZXJhdGluZyBvd24gcHJvcGVydGllcy4gRm9yIGJvdGgsIHRoZVxuICogcHJlZmVycmVkIHJlcGFpcnMgYXJlXG4gKiAgICAqIGF1dG9iaW5kaW5nOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSxcbiAqICAgICAgYGZvbyhvYmoubWV0aG9kKWAgd2l0aCBgZm9vKGFyZyA9PiBgb2JqLm1ldGhvZChhcmcpKWAuIElPVywgc3RvcCByZWx5aW5nXG4gKiAgICAgIG9uIGV4cHJlc3Npb25zIGxpa2UgYG9iai5tZXRob2RgIHRvIGV4dHJhY3QgYSBtZXRob2Qgc3RpbGwgYm91bmQgdG8gdGhlXG4gKiAgICAgIHN0YXRlIG9mIGBvYmpgIGJlY2F1c2UsIGZvciB2aXJ0dWFsIGFuZCBkdXJhYmxlIG9iamVjdHMsXG4gKiAgICAgIHRoZXkgbm8gbG9uZ2VyIHdpbGwgYWZ0ZXIgIzU5NzAuXG4gKiAgICAqIG1ldGhvZCBlbnVtZXJhdGlvbjogUmVwbGFjZSwgZm9yIGV4YW1wbGVcbiAqICAgICAgYFJlZmxlY3Qub3duS2V5cyhvYmopYCB3aXRoIGBnZXRNZXRob2ROYW1lcyhvYmopYC5cbiAqXG4gKiBPbmNlIGFsbCBwcm9ibGVtYXRpYyBjYXNlcyBoYXZlIGJlZW4gY29udmVydGVkIGluIHRoaXMgbWFubmVyLCB0aGlzXG4gKiBgYmluZEFsbE1ldGhvZHNgIGhhY2sgY2FuIGFuZCBUT0RPIHNob3VsZCBiZSBkZWxldGVkLiBIb3dldmVyLCB3ZSBjdXJyZW50bHlcbiAqIGhhdmUgbm8gcmVsaWFibGUgc3RhdGljIHdheSB0byB0cmFjayBkb3duIGFuZCBmaXggYWxsIGF1dG9iaW5kaW5nIHNpdGVzLlxuICogRm9yIHRob3NlIG9iamVjdHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBmdWxseSByZXBhaXJlZCBieSB0aGUgYWJvdmUgdHdvXG4gKiB0ZWNobmlxdWVzLCBgYmluZEFsbE1ldGhvZHNgIGNyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBtdWNoIGxpa2UgdGhlXG4gKiBwcmUtIzU5NzAgb2JqZWN0cywgd2l0aCBhbGwgdGhlaXIgbWV0aG9kcyBhcyBpbnN0YW5jZS1ib3VuZCBvd24gcHJvcGVydGllcy5cbiAqIEl0IGRvZXMgdGhpcyBieSBtYWtpbmcgYSBuZXcgb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgb2JqYCB3aGVyZSB0aGUgbmV3XG4gKiBvYmplY3QgaGFzIGJvdW5kIG93biBtZXRob2RzIG92ZXJyaWRkaW5nIGFsbCB0aGUgbWV0aG9kcyBpdCB3b3VsZCBoYXZlXG4gKiBpbmhlcml0ZWQgZnJvbSBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gb2JqXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlfVxuICovXG5jb25zdCAgICAgICAgYmluZEFsbE1ldGhvZHM9KG9iaik9PlxuaGFyZGVuKFxuY3JlYXRlKFxub2JqLFxuZnJvbUVudHJpZXMoXG5nZXRNZXRob2ROYW1lcyhvYmopLm1hcCgobmFtZSk9Pltcbm5hbWUsXG57XG52YWx1ZTooLyoqIEB0eXBlIHt1bmtub3duW119ICovLi4uYXJncyk9PlxuYXBwbHkob2JqW25hbWVdLG9iaixhcmdzKSxcbmVudW1lcmFibGU6dHJ1ZX1dKSkpKTskaOKAjV9vbmNlLmJpbmRBbGxNZXRob2RzKGJpbmRBbGxNZXRob2RzKTtcblxuXG5cblxuXG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBEZWVwbHlBd2FpdGVkPFRbS10+IH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIENhdmVhdHM6XG4gKiAtIGRvZXNuJ3QgcmVjdXIgd2l0aGluIFByb21pc2UgcmVzdWx0c1xuICogLSByZXN1bHRpbmcgdHlwZSBoYXMgd3JhcHBlciBpbiBpdHMgbmFtZVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT4gPyBBd2FpdGVkPFQ+IDogVCBleHRlbmRzIHt9ID8gRGVlcGx5QXdhaXRlZE9iamVjdDxUPiA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEEgbW9yZSBjb25zdHJhaW5lZCB2ZXJzaW9uIG9mIHtkZWVwbHlGdWxmaWxsZWR9IGZvciB0eXBlIHNhZmV0eSB1bnRpbCBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWQgaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9KG9iaik9PntcbmFzc2VydChpc09iamVjdChvYmopLCdwYXJhbSBtdXN0IGJlIGFuIG9iamVjdCcpO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuLyoqIEBwYXJhbSB7KCkgPT4gYW55fSBmbiAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPW5ldyBFcnJvcihtZXNzYWdlKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVycix7XG5uYW1lOntcbnZhbHVlOidBZ2dyZWdhdGVFcnJvcid9LFxuXG5lcnJvcnM6e1xudmFsdWU6ZXJyb3JzfX0pO1xuXG5cbnJldHVybiBlcnI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtyZWFkb25seSAoVCB8IFByb21pc2VMaWtlPFQ+KVtdfSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaOKAjV9vbmNlLm1ha2VBZ2dyZWdhdGVFcnJvcihtYWtlQWdncmVnYXRlRXJyb3IpO1xuY29uc3QgICAgICAgIFByb21pc2VBbGxPckVycm9ycz1hc3luYyh2YWx1ZXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHZhbHVlcykudGhlbigocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz0vKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqL1xucmVzdWx0cy5maWx0ZXIoKHtzdGF0dXN9KT0+c3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoKHJlc3VsdCk9PnJlc3VsdC5yZWFzb24pO1xuaWYoIWVycm9ycy5sZW5ndGgpe1xucmV0dXJuICgvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi9yZXN1bHRzLm1hcChcbihyZXN1bHQpPT5yZXN1bHQudmFsdWUpKTtcblxuIH1lbHNlIGlmKGVycm9ycy5sZW5ndGg9PT0xKXtcbnRocm93IGVycm9yc1swXTtcbiB9ZWxzZXtcbnRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuIH1cbiB9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHs8VD4oXG4gKiAgIHRyaWVyOiAoKSA9PiBQcm9taXNlPFQ+LFxuICogIGZpbmFsaXplcjogKGVycm9yPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPixcbiAqICkgPT4gUHJvbWlzZTxUPn1cbiAqLyRo4oCNX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7Y29uc3QgYWdncmVnYXRlVHJ5RmluYWxseT1hc3luYyh0cmllcixmaW5hbGl6ZXIpPT5cbnRyaWVyKCkudGhlbihcbmFzeW5jKHJlc3VsdCk9PmZpbmFsaXplcigpLnRoZW4oKCk9PnJlc3VsdCksXG5hc3luYyh0cnlFcnJvcik9PlxuZmluYWxpemVyKHRyeUVycm9yKS5cbnRoZW4oXG4oKT0+dHJ5RXJyb3IsXG4oZmluYWxpemVFcnJvcik9Pm1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsZmluYWxpemVFcnJvcl0pKS5cblxudGhlbigoZXJyb3IpPT5Qcm9taXNlLnJlamVjdChlcnJvcikpKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydChcImZzXCIpLlJlYWRTdHJlYW0gfCBYaW1wb3J0KFwiZnNcIikuV3JpdGVTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5jb25zdCAgICAgICAgZnNTdHJlYW1SZWFkeT0oc3RyZWFtKT0+XG5uZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57XG5pZihzdHJlYW0uZGVzdHJveWVkKXtcbnJlamVjdChuZXcgRXJyb3IoJ1N0cmVhbSBhbHJlYWR5IGRlc3Ryb3llZCcpKTtcbnJldHVybjtcbiB9XG5cbmlmKCFzdHJlYW0ucGVuZGluZyl7XG5yZXNvbHZlKCk7XG5yZXR1cm47XG4gfVxuXG5jb25zdCBvblJlYWR5PSgpPT57XG5jbGVhbnVwKCk7LyogZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXNvbHZlKCk7XG4gfTtcblxuLyoqIEBwYXJhbSB7RXJyb3J9IGVyciAqL1xuY29uc3Qgb25FcnJvcj0oZXJyKT0+e1xuY2xlYW51cCgpOy8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmVqZWN0KGVycik7XG4gfTtcblxuY29uc3QgY2xlYW51cD0oKT0+e1xuc3RyZWFtLm9mZigncmVhZHknLG9uUmVhZHkpO1xuc3RyZWFtLm9mZignZXJyb3InLG9uRXJyb3IpO1xuIH07XG5cbnN0cmVhbS5vbigncmVhZHknLG9uUmVhZHkpO1xuc3RyZWFtLm9uKCdlcnJvcicsb25FcnJvcik7XG4gfSk7JGjigI1fb25jZS5mc1N0cmVhbVJlYWR5KGZzU3RyZWFtUmVhZHkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sIm9iamVjdE1hcCI6WyJvYmplY3RNYXAiXSwibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXSwidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdLCJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl0sImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwibWFrZU1lYXN1cmVTZWNvbmRzIjpbIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJtYWtlQWdncmVnYXRlRXJyb3IiOlsibWFrZUFnZ3JlZ2F0ZUVycm9yIl0sIlByb21pc2VBbGxPckVycm9ycyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiXSwiYWdncmVnYXRlVHJ5RmluYWxseSI6WyJhZ2dyZWdhdGVUcnlGaW5hbGx5Il0sImZzU3RyZWFtUmVhZHkiOlsiZnNTdHJlYW1SZWFkeSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABS8904iAsAAIgLAAAiAAAAQGFnb3JpYy9uYXQtdjQuMS4wL2Rpc3QvbmF0LmVzbS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7YW55fSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50IHwgbnVtYmVyfSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IG5ldyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAd0s+I6MdAACjHQAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInVwZGF0ZUZyb21JdGVyYWJsZSIsInVwZGF0ZUZyb21Ob3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9tYXN0ZXIvbWFpbi9kaXN0cmlidXRlZC1wcm9ncmFtbWluZy5tZCNub3RpZmllcnNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0NvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9KG5vdGlmaWVyUCk9PntcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmFibGVGcm9tTm90aWZpZXInLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pntcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnR9ICovXG5sZXQgbG9jYWxVcGRhdGVDb3VudDtcbi8qKiBAdHlwZSB7UHJvbWlzZTx7dmFsdWU6IFQsIGRvbmU6IGJvb2xlYW59PiB8IHVuZGVmaW5lZH0gKi9cbmxldCBteUl0ZXJhdGlvblJlc3VsdFA7XG5yZXR1cm4gRmFyKCdhc3luY0l0ZXJhdG9yRnJvbU5vdGlmaWVyJyx7XG5uZXh0OigpPT57XG5pZighbXlJdGVyYXRpb25SZXN1bHRQKXtcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4qL1xuLyogdW5yZXNvbHZlZCBwcm9taXNlLCBgbXlJdGVyYXRpb25SZXN1bHRQYCwgYW5kIHVudGlsKi9cbi8qIGBteUl0ZXJhdGlvblJlc3VsdFBgIGlzIGZ1bGZpbGxlZCB3aXRoIGFuKi9cbi8qIGl0ZXJhdGlvbiByZXN1bHQsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgcHJvbWlzZSBhZ2FpbiB3aXRob3V0IGFza2luZyB0aGUgbm90aWZpZXIqL1xuLyogZm9yIG1vcmUgdXBkYXRlcy4gSWYgdGhlcmUncyBhbHJlYWR5IGFuIHVuYW5zd2VyZWQgYXNrIGluIHRoZSovXG4vKiBhaXIsIGFsbCBmdXJ0aGVyIGFza3Mgc2hvdWxkIGp1c3QgcmV1c2UgdGhlIHJlc3VsdCBvZiB0aGF0IG9uZS4qL1xuLyoqL1xuLyogVGhpcyByZXVzZSBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlIGFzeW5jKi9cbi8qIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4vKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkKi9cbi8qIGFmdGVyIHRoZSBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMqL1xuLyogZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiovXG4vKiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCBhZ2Fpbi4qL1xuLyoqL1xuLyogU2VlKi9cbi8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4vKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5teUl0ZXJhdGlvblJlc3VsdFA9RShub3RpZmllclApLlxuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCkuXG50aGVuKCh7dmFsdWUsdXBkYXRlQ291bnR9KT0+e1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcbmNvbnN0IGRvbmU9bG9jYWxVcGRhdGVDb3VudD09PXVuZGVmaW5lZDtcbmlmKCFkb25lKXtcbi8qIE9uY2UgdGhlIG91dHN0YW5kaW5nIHF1ZXN0aW9uIGhhcyBiZWVuIGFuc3dlcmVkLCBzdG9wKi9cbi8qIHVzaW5nIHRoYXQgYW5zd2VyLCBzbyBhbnkgZnVydGhlciBgbmV4dCgpYCBxdWVzdGlvbnMqL1xuLyogY2F1c2UgYSBuZXcgYGdldFVwZGF0ZVNpbmNlYCByZXF1ZXN0LiovXG4vKiovXG4vKiBCdXQgb25seSBpZiBtb3JlIGFuc3dlcnMgYXJlIGV4cGVjdGVkLiBPbmNlIHRoZSBub3RpZmllciovXG4vKiBpcyBgZG9uZWAsIHRoYXQgd2FzIHRoZSBsYXN0IGFuc3dlciBzbyByZXVzZSBpdCBmb3JldmVyLiovXG5teUl0ZXJhdGlvblJlc3VsdFA9dW5kZWZpbmVkO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9KTtcbiB9XG4vKiB4eHggaGludCBmb3IgdHlwZSBjaGVja2VyKi9cbmFzc2VydChteUl0ZXJhdGlvblJlc3VsdFApO1xucmV0dXJuIG15SXRlcmF0aW9uUmVzdWx0UDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0b3I9KGFzeW5jSXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xucmV0dXJuIG5ldyBQcm9taXNlKChhY2ssb2JzZXJ2ZXJFcnJvcik9PntcbmNvbnN0IHJlY3VyPSgpPT57XG5FLndoZW4oXG5FKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4oe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG5pdGVyYXRpb25PYnNlcnZlci5maW5pc2gmJml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG5hY2sodW5kZWZpbmVkKTtcbiB9ZWxzZXtcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlJiZcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbnJlY3VyKCk7XG4gfVxuIH0sXG4ocmVhc29uKT0+e1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuYWNrKHVuZGVmaW5lZCk7XG4gfSkuXG5jYXRjaChvYnNlcnZlckVycm9yKTtcbiB9O1xucmVjdXIoKTtcbiB9KTtcbiB9O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRpb249KGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xucmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBvYnNlcnZlSXRlcmF0aW9uYCBpbnN0ZWFkXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbUl0ZXJhYmxlPShpdGVyYXRpb25PYnNlcnZlcixhc3luY0l0ZXJhYmxlUCk9Plxub2JzZXJ2ZUl0ZXJhdGlvbihhc3luY0l0ZXJhYmxlUCxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLnVwZGF0ZUZyb21JdGVyYWJsZSh1cGRhdGVGcm9tSXRlcmFibGUpO1xuY29uc3QgICAgICAgIG9ic2VydmVOb3RpZmllcj0obm90aWZpZXJQLGl0ZXJhdGlvbk9ic2VydmVyKT0+XG5vYnNlcnZlSXRlcmF0aW9uKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSAnb2JzZXJ2ZU5vdGlmaWVyYCBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclBcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIHVwZGF0ZUZyb21Ob3RpZmllcj0oaXRlcmF0aW9uT2JzZXJ2ZXIsbm90aWZpZXJQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpOyRo4oCNX29uY2UudXBkYXRlRnJvbU5vdGlmaWVyKHVwZGF0ZUZyb21Ob3RpZmllcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwidXBkYXRlRnJvbUl0ZXJhYmxlIjpbInVwZGF0ZUZyb21JdGVyYWJsZSJdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIl0sInVwZGF0ZUZyb21Ob3RpZmllciI6WyJ1cGRhdGVGcm9tTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHa5YMuoJAADqCQAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVB1Ymxpc2hLaXQiLCJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0IiwidXBkYXRlRnJvbUl0ZXJhYmxlIiwidXBkYXRlRnJvbU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6WyIuL3N0b3Jlc3ViLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUHVibGlzaEtpdFwiXV1dLFtcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2xpdmVbXCJzdWJzY3JpYmVFYWNoXCJdXV0sW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9saXZlW1wic3Vic2NyaWJlTGF0ZXN0XCJdXV1dXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtbXCJtYWtlTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJcIl1dXSxbXCJtYWtlTm90aWZpZXJLaXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJLaXRcIl1dXSxbXCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlXCJdXV0sW1wibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiXV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uXCIsIFskaOKAjV9saXZlW1wibWFrZVN1YnNjcmlwdGlvblwiXV1dLFtcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCJdXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlTm90aWZpZXJcIl1dXSxbXCJvYnNlcnZlSXRlcmF0b3JcIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlSXRlcmF0b3JcIl1dXSxbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZUl0ZXJhdGlvblwiXV1dLFtcInVwZGF0ZUZyb21JdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcInVwZGF0ZUZyb21JdGVyYWJsZVwiXV1dLFtcInVwZGF0ZUZyb21Ob3RpZmllclwiLCBbJGjigI1fbGl2ZVtcInVwZGF0ZUZyb21Ob3RpZmllclwiXV1dLFtcIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIl1dXV1dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiLGZhbHNlXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIixmYWxzZV0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiLGZhbHNlXSwibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciIsZmFsc2VdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0IixmYWxzZV0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIixmYWxzZV0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIixmYWxzZV0sIm1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiIsZmFsc2VdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiLGZhbHNlXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciIsZmFsc2VdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIixmYWxzZV0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiIsZmFsc2VdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIixmYWxzZV0sInVwZGF0ZUZyb21Ob3RpZmllciI6WyJ1cGRhdGVGcm9tTm90aWZpZXIiLGZhbHNlXSwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOa9HeEAqAABAKgAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsbWFrZVByb21pc2VLaXQsRSxGYXIsbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiLCBbJGjigI1fYSA9PiAobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPiB8IE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPiAmIFNoYXJhYmxlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9PntcbmNvbnN0IGFzeW5jSXRlcmFibGU9bWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoc2hhcmFibGVJbnRlcm5hbHNQKTtcblxuLyoqIEB0eXBlIHtBc3luY0l0ZXJhYmxlPFQ+ICYgU2hhcmFibGVOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLmFzeW5jSXRlcmFibGUsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5zaGFyYWJsZUludGVybmFsc1AsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcktpdD0oLi4uaW5pdGlhbFN0YXRlQXJyKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlUmVjb3JkPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlS2l0O1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIChudW1iZXIgfCB1bmRlZmluZWQpfSAqL1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0xOy8qIGF2b2lkIGZhbHN5IG51bWJlcnMqL1xuLyoqIEB0eXBlIHtVcGRhdGVSZWNvcmQ8VD58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcblxuY29uc3QgaGFzU3RhdGU9KCk9PmN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZDtcblxuY29uc3QgZmluYWw9KCk9PmN1cnJlbnRVcGRhdGVDb3VudD09PXVuZGVmaW5lZDtcblxuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG4vKiBOYU4gbWF0Y2hlcyBub3RoaW5nKi9cbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PU5hTil7XG5pZihcbmhhc1N0YXRlKCkmJihcbmZpbmFsKCl8fFxuY3VycmVudFJlc3BvbnNlJiZjdXJyZW50UmVzcG9uc2UudXBkYXRlQ291bnQhPT11cGRhdGVDb3VudCkpXG57XG4vKiBJZiBoYXNTdGF0ZSgpIGFuZCBlaXRoZXIgaXQgaXMgZmluYWwoKSBvciBpdCBpcyovXG4vKiBub3QgdGhlIHN0YXRlIG9mIHVwZGF0ZUNvdW50LCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuKi9cbmFzc2VydChjdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQpO1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbi8qIG90aGVyd2lzZSByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoIW9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0PW1ha2VQcm9taXNlS2l0KCk7XG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlS2l0LnByb21pc2U7XG4gfX0pO1xuXG5cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyfSk7XG5cblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlKHN0YXRlKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lIGhhc1N0YXRlKCkgJiYgIWZpbmFsKCkqL1xuYXNzZXJ0KGN1cnJlbnRVcGRhdGVDb3VudCk7XG5jdXJyZW50VXBkYXRlQ291bnQrPTE7XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlOnN0YXRlLFxudXBkYXRlQ291bnQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbmlmKG9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0LnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbm9wdE5leHRQcm9taXNlS2l0PXVuZGVmaW5lZDtcbiB9XG4gfSxcblxuZmluaXNoKGZpbmFsU3RhdGUpe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5pc2ggYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgaGFzU3RhdGUoKSAmJiBmaW5hbCgpKi9cbmN1cnJlbnRVcGRhdGVDb3VudD11bmRlZmluZWQ7XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlOmZpbmFsU3RhdGUsXG51cGRhdGVDb3VudDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxuaWYob3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xub3B0TmV4dFByb21pc2VLaXQ9dW5kZWZpbmVkO1xuIH1cbiB9LFxuXG5mYWlsKHJlYXNvbil7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IGZhaWwgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgIWhhc1N0YXRlKCkgJiYgZmluYWwoKSovXG5jdXJyZW50VXBkYXRlQ291bnQ9dW5kZWZpbmVkO1xuY3VycmVudFJlc3BvbnNlPXVuZGVmaW5lZDtcbmlmKCFvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuIH1cbi8qIERvbid0IHRyaWdnZXIgTm9kZS5qcydzIFVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25XYXJuaW5nKi9cbm9wdE5leHRQcm9taXNlS2l0LnByb21pc2UuY2F0Y2goKF8pPT57IH0pO1xub3B0TmV4dFByb21pc2VLaXQucmVqZWN0KHJlYXNvbik7XG4gfX0pO1xuXG5cbmFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoPD0xLCd0b28gbWFueSBhcmd1bWVudHMnKTtcbmlmKGluaXRpYWxTdGF0ZUFyci5sZW5ndGg9PT0xKXtcbnVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiB9XG5cbi8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuLyogaXMgdGlnaHRseSBoZWxkKi9cbnJldHVybiBoYXJkZW4oe25vdGlmaWVyLHVwZGF0ZXJ9KTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyUCk9Pntcbi8qKiBAdHlwZSB7YmlnaW50fSAqL1xubGV0IGxhdGVzdEluYm91bmRDb3VudDtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiBiaWdpbnR9ICovXG5sZXQgbGF0ZXN0VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge1dlYWtNYXA8UHVibGljYXRpb25SZWNvcmQ8VD4sIFByb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pj59ICovXG5jb25zdCBvdXRib3VuZFJlc3VsdHM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uUmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59XG4gKi9cbmNvbnN0IHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuLyogTGV2ZXJhZ2UgaWRlbnRpdHkgcHJlc2VydmF0aW9uIG9mIGByZWNvcmRgLiovXG5jb25zdCBleGlzdGluZ091dGJvdW5kUmVzdWx0PW91dGJvdW5kUmVzdWx0cy5nZXQocmVjb3JkKTtcbmlmKGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQpe1xucmV0dXJuIGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQ7XG4gfVxuXG5sYXRlc3RJbmJvdW5kQ291bnQ9cmVjb3JkLnB1Ymxpc2hDb3VudDtcbmxhdGVzdFVwZGF0ZUNvdW50Kz0xbjtcbmNvbnN0IHJlc3VsdFA9RS53aGVuKHJlY29yZC5oZWFkLCh7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OmxhdGVzdFVwZGF0ZUNvdW50fSk7XG4gfSk7XG5vdXRib3VuZFJlc3VsdHMuc2V0KHJlY29yZCxyZXN1bHRQKTtcbnJldHVybiByZXN1bHRQO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtCYXNlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9LTFuKXtcbmFzc2VydChcbnVwZGF0ZUNvdW50PD1sYXRlc3RVcGRhdGVDb3VudCxcbidhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cblxuaWYodXBkYXRlQ291bnQ8bGF0ZXN0VXBkYXRlQ291bnQpe1xuLyogUmV0dXJuIHRoZSBtb3N0IHJlY2VudCByZXN1bHQgcG9zc2libGUgd2l0aG91dCBpbXBvc2luZyBhbiB1bm5lY2Vzc2FyeSBkZWxheS4qL1xucmV0dXJuIEUoc3Vic2NyaWJlclApLlxuc3Vic2NyaWJlQWZ0ZXIoKS5cbnRoZW4odHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkKTtcbiB9XG5cbi8qIFJldHVybiBhIHJlc3VsdCB0aGF0IGZvbGxvd3MgdGhlIGxhc3QtcmV0dXJuZWQgcmVzdWx0LCovXG4vKiBza2lwcGluZyBvdmVyIGludGVybWVkaWF0ZSByZXN1bHRzIGlmIGxhdGVzdEluYm91bmRDb3VudCovXG4vKiBubyBsb25nZXIgY29ycmVzcG9uZHMgd2l0aCB0aGUgbGF0ZXN0IHJlc3VsdC4qL1xuLyogTm90ZSB0aGF0IHVubGlrZSBub3RpZmllcnMgYW5kIHN1YnNjcmliZXJzIHJlc3BlY3RpdmVseSByZXR1cm5lZCBieSovXG4vKiBtYWtlTm90aWZpZXJLaXQgYW5kIG1ha2VQdWJsaXNoS2l0LCB0aGlzIHJlc3VsdCBpcyBub3QgZ3VhcmFudGVlZCovXG4vKiB0byBmb2xsb3cgdGhlIHJlc3VsdCByZXR1cm5lZCB3aGVuIGEgbm9uLWxhdGVzdCB1cGRhdGVDb3VudCBpcyBwcm92aWRlZCovXG4vKiAoZS5nLiwgaXQgaXMgcG9zc2libGUgZm9yIGBub3RpZmllckZyb21TdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKClgIGFuZCovXG4vKiBgbm90aWZpZXJGcm9tU3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZShsYXRlc3RVcGRhdGVDb3VudClgIHRvIGJvdGgqL1xuLyogc2V0dGxlIHRvIHRoZSBzYW1lIG9iamVjdCBgbmV3TGF0ZXN0YCB3aGVyZSBgbmV3TGF0ZXN0LnVwZGF0ZUNvdW50YCovXG4vKiBpcyBvbmUgZ3JlYXRlciB0aGFuIGBsYXRlc3RVcGRhdGVDb3VudGApLiovXG5yZXR1cm4gRShzdWJzY3JpYmVyUCkuXG5zdWJzY3JpYmVBZnRlcihsYXRlc3RJbmJvdW5kQ291bnQpLlxudGhlbih0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcixcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PmJhc2VOb3RpZmllcixcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIGJpZ2ludH0gKi9cbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xubGV0IGZpbmFsPWZhbHNlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7QmFzZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgbmV3IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+YmFzZU5vdGlmaWVyLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABSS0CSLFwAAixcAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VQdWJsaXNoS2l0Iiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBIYW5kbGVkUHJvbWlzZSxFLG1ha2VQcm9taXNlS2l0LEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJIYW5kbGVkUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoSGFuZGxlZFByb21pc2UgPSAkaOKAjV9hKV1dLFtcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0IHNpbms9KCk9PnsgfTtcblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25MaXN0IGFzIGl0IGFwcGVhcnMuXG4gKiBBcyBpdCBwcm9jZWVkcywgaXQgbXVzdCBkcm9wIHRoZSBwYXJ0cyBvZiB0aGUgbGlzdCBpdCBubyBsb25nZXIgbmVlZHMuXG4gKiBUaHVzLCBpZiBubyBvbmUgZWxzZSBpcyBob2xkaW5nIG9uIHRvIHRob3NlLCBpdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25MaXN0PFQ+fSBwdWJMaXN0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvcj0ocHViTGlzdCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5yZXR1cm4gRmFyKCdFYWNoSXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0IHJlc3VsdFA9RS5nZXQocHViTGlzdCkuaGVhZDtcbnB1Ykxpc3Q9RS5nZXQocHViTGlzdCkudGFpbDtcbi8qIFdlIGV4cGVjdCB0aGUgdGFpbCB0byBiZSB0aGUgXCJjYW5ub3QgcmVhZCBwYXN0IGVuZFwiIGVycm9yIGF0IHRoZSBlbmQqL1xuLyogb2YgdGhlIGhhcHB5IHBhdGguKi9cbi8qIFNpbmNlIHdlIGFyZSB3cmFwcGluZyB0aGF0IGVycm9yIHdpdGggZXZlbnR1YWwgc2VuZCwgd2Ugc2luayB0aGUqL1xuLyogcmVqZWN0aW9uIGhlcmUgdG9vIHNvIGl0IGRvZXNuJ3QgYmVjb21lIGFuIGludmFsaWQgdW5oYW5kbGVkIHJlamVjdGlvbiovXG4vKiBsYXRlci4qL1xudm9pZCBFLndoZW4ocHViTGlzdCxzaW5rLHNpbmspO1xucmV0dXJuIHJlc3VsdFA7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJwcmVmaXggbG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwicHJlZml4IGxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgZXZlcnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlXG4gKiB5b3UgYXNrIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBmb3IgYW4gaXRlcmF0b3IuIEJ1dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3JcbiAqIHdpbGwgZW51bWVyYXRlIGVhY2ggdGhpbmcgcHVibGlzaGVkIGZyb20gdGhhdCBpdGVyYXRvcidzIHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVFYWNoPShzdWJzY3JpYmVyKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdFYWNoSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IHB1Ykxpc3Q9RShzdWJzY3JpYmVyKS5zdWJzY3JpYmVBZnRlcigpO1xucmV0dXJuIG1ha2VFYWNoSXRlcmF0b3IocHViTGlzdCk7XG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvcj0oc3Vic2NyaWJlcik9PntcbmxldCBsYXRlc3RQdWJsaXNoQ291bnQ7XG5yZXR1cm4gRmFyKCdMYXRlc3RJdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3QgcHViTGlzdD1FKHN1YnNjcmliZXIpLnN1YnNjcmliZUFmdGVyKGxhdGVzdFB1Ymxpc2hDb3VudCk7XG4vKiBXaXRob3V0IGFuIG9uUmVqZWN0aW9uLCBpZiBwdWJMaXN0IGlzIGEgcmVqZWN0aW9uLCB0aGlzIHdpbGwqL1xuLyogcHJvcGFnYXRlIHRoZSByZWplY3Rpb24gYXMgaXQgc2hvdWxkLiovXG5yZXR1cm4gRS53aGVuKHB1Ykxpc3QsKHtoZWFkLHB1Ymxpc2hDb3VudH0pPT57XG5sYXRlc3RQdWJsaXNoQ291bnQ9cHVibGlzaENvdW50O1xucmV0dXJuIGhlYWQ7XG4gfSk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGFueSBwdWJsaXNoZWQgc3RhdGUgaWYgYSBtb3JlXG4gKiByZWNlbnQgcHVibGlzaGVkIHN0YXRlIGNhbiBiZSByZXBvcnRlZCBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVMYXRlc3Q9KHN1YnNjcmliZXIpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0xhdGVzdEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlTGF0ZXN0SXRlcmF0b3Ioc3Vic2NyaWJlcil9KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UHVibGlzaEtpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQdWJsaXNoS2l0PSgpPT57XG4vKiogQHR5cGUge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSAqL1xubGV0IHRhaWxQO1xuLyoqIEB0eXBlIHt1bmRlZmluZWQgfCAoKHZhbHVlOiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+PikgPT4gdm9pZCl9ICovXG5sZXQgdGFpbFI7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG5cbmxldCBjdXJyZW50UHVibGlzaENvdW50PTBuO1xubGV0IGN1cnJlbnRQPXRhaWxQO1xuY29uc3QgYWR2YW5jZUN1cnJlbnQ9KGRvbmUsdmFsdWUscmVqZWN0aW9uKT0+e1xuaWYodGFpbFI9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuY3VycmVudFB1Ymxpc2hDb3VudCs9MW47XG5jdXJyZW50UD10YWlsUDtcbmNvbnN0IHJlc29sdmVDdXJyZW50PXRhaWxSO1xuXG5pZihkb25lKXtcbnRhaWxQPUhhbmRsZWRQcm9taXNlLnJlamVjdChcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcblxuLyogU3VwcHJlc3MgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvci4qL1xudGFpbFAuY2F0Y2goKCk9PnsgfSk7XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge1N1YnNjcmliZXI8VD59XG4gKi9cbmNvbnN0IHN1YnNjcmliZXI9RmFyKCdTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50PS0xbik9PntcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IG5ldyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH19KTtcblxuXG4vKiogQHR5cGUge1B1Ymxpc2hlcjxUPn0gKi9cbmNvbnN0IHB1Ymxpc2hlcj1GYXIoJ1B1Ymxpc2hlcicse1xucHVibGlzaDoodmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudChmYWxzZSx2YWx1ZSk7XG4gfSxcbmZpbmlzaDooZmluYWxWYWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KHRydWUsZmluYWxWYWx1ZSk7XG4gfSxcbmZhaWw6KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1IYW5kbGVkUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbi8qIFN1cHByZXNzIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3IuKi9cbnJlamVjdGlvbi5jYXRjaCgoKT0+eyB9KTtcbmFkdmFuY2VDdXJyZW50KHRydWUsdW5kZWZpbmVkLHJlamVjdGlvbik7XG4gfX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaXNoZXIsc3Vic2NyaWJlcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPJbLelGHgAARh4AACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlTWFyc2hhbCxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUVhY2gsbWFrZVN1YnNjcmlwdGlvbktpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dLFtcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuY29uc3QgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKSlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbndoaWxlKCFmaW5pc2hlZCl7XG4vKiBBbGxvdyBuZXN0ZWQgYXdhaXRzIChpbiBsb29wKSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgZWFjaCB0byBydW4gaW4gYSB0dXJuKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5jb25zdHt2YWx1ZSxkb25lfT1hd2FpdCBFKGl0ZXJhdG9yUCkubmV4dCgpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmliZXI9KHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydChzdWJzY3JpYmVyJiZzdG9yYWdlTm9kZSYmbWFyc2hhbGxlciwnbWlzc2luZyBhcmd1bWVudCcpO1xuXG5jb25zdCBzdG9yZVZhbHVlPSh2YWx1ZSk9PlxuRShtYXJzaGFsbGVyKS5cbnNlcmlhbGl6ZSh2YWx1ZSkuXG50aGVuKChzZXJpYWxpemVkKT0+e1xuY29uc3QgZW5jb2RlZD1KU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiB9KTtcblxuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlcixzdG9yZVZhbHVlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuXG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLnVuc2VyaWFsaXplKGRhdGEpfSk7XG5cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpYmVyJyx7XG4uLi5zdWJzY3JpYmVyLFxuZ2V0U3RvcmVLZXk6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uPShcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsdW5kZWZpbmVkLHtcbm1hcnNoYWxTYXZlRXJyb3I6KCk9PnsgfX0pKT0+XG5cbntcbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiBBYm9ydCB0aGUgaXRlcmF0aW9uIG9uIHRoZSBuZXh0IG9ic2VydmF0aW9uIGlmIHRoZSBwdWJsaXNoZXIgZXZlciBmYWlscy4qL1xubGV0IHB1Ymxpc2hGYWlsZWQ9ZmFsc2U7XG5sZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuY29uc3QgZmFpbD0oZXJyKT0+e1xucHVibGlzaEZhaWxlZD10cnVlO1xucHVibGlzaEV4Y2VwdGlvbj1lcnI7XG4gfTtcblxuLyogTXVzdCAqbm90KiBiZSBhbiBhc3luYyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBzb21ldGltZXMgbXVzdCB0aHJvdyB0byBhYm9ydCovXG4vKiB0aGUgaXRlcmF0aW9uLiovXG5jb25zdCBwdWJsaXNoVmFsdWU9KG9iaik9PntcbmFzc2VydChzdG9yYWdlTm9kZSk7XG5pZihwdWJsaXNoRmFpbGVkKXtcbi8qIFRvIHByb3Blcmx5IGFib3J0IHRoZSBpdGVyYXRpb24sIHRoaXMgbXVzdCBiZSBhIHN5bmNocm9ub3VzIGV4Y2VwdGlvbi4qL1xudGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiB9XG5cbi8qIFB1Ymxpc2ggdGhlIHZhbHVlLCBjYXB0dXJpbmcgYW55IGVycm9yLiovXG5FKG1hcnNoYWxsZXIpLlxuc2VyaWFsaXplKG9iaikuXG50aGVuKChzZXJpYWxpemVkKT0+e1xuY29uc3QgZW5jb2RlZD1KU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiB9KS5cbmNhdGNoKGZhaWwpO1xuIH07XG5cbmlmKHN0b3JhZ2VOb2RlKXtcbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24se1xudXBkYXRlU3RhdGU6cHVibGlzaFZhbHVlLFxuZmluaXNoOnB1Ymxpc2hWYWx1ZX0pLlxuY2F0Y2goZmFpbCk7XG4gfVxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaXB0aW9uJyx7XG5nZXRTdG9yZUtleTphc3luYygpPT57XG5pZighc3RvcmFnZU5vZGUpe1xucmV0dXJuIGhhcmRlbih7c3Vic2NyaXB0aW9ufSk7XG4gfVxuY29uc3Qgc3RvcmVLZXk9YXdhaXQgRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKTtcbnJldHVybiBoYXJkZW4oey4uLnN0b3JlS2V5LHN1YnNjcmlwdGlvbn0pO1xuIH0sXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcixcbmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOlxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpzdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hlcktpdFxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1Ymxpc2hlclxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcixjaGlsZFBhdGgpPT57XG5jb25zdHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259PW1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuaWYoc3RvcmFnZU5vZGUmJmNoaWxkUGF0aCl7XG5zdG9yYWdlTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gfVxuXG4vKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuY29uc3Qgc3Vic2NyaWJlcj1tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuXG5yZXR1cm57XG5wdWJsaXNoZXI6cHVibGljYXRpb24sXG5zdWJzY3JpYmVyfTtcblxuIH07XG5cbi8qKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRvEy5OQwAADkMAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZVB1Ymxpc2hLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvbjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbj0oc2hhcmFibGVJbnRlcm5hbHNQKT0+e1xuY29uc3Qgc3Vic2NyaXB0aW9uPUZhcignU3Vic2NyaXB0aW9uJyx7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZVN1YnNjcmlwdGlvbkl0ZXJhdG9yKHNoYXJhYmxlSW50ZXJuYWxzUCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqXG4gKiBAcmV0dXJucyB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59XG4gKi9cbmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOigpPT5zaGFyYWJsZUludGVybmFsc1AsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gdGFpbFBcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25JdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbkl0ZXJhdG9yPSh0YWlsUCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5yZXR1cm4gRmFyKCdTdWJzY3JpcHRpb25JdGVyYXRvcicse1xuc3Vic2NyaWJlOigpPT5tYWtlU3Vic2NyaXB0aW9uKHRhaWxQKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcih0YWlsUCksXG5uZXh0OigpPT57XG5jb25zdCByZXN1bHRQPUUuZ2V0KHRhaWxQKS5oZWFkO1xudGFpbFA9RS5nZXQodGFpbFApLnRhaWw7XG5Qcm9taXNlLnJlc29sdmUodGFpbFApLmNhdGNoKCgpPT57IH0pOy8qIHN1cHByZXNzIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3IqL1xucmV0dXJuIHJlc3VsdFA7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfWAgZm9yIGRvaW5nIGxvc3NsZXNzIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1Yi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvblJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbktpdD0oKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbi8qIFRoZSBwdWJsaXNoIGtpdCBzdWJzY3JpYmVyIGlzIHByZWZpeC1sb3NzeSwgc28gbWFraW5nICp0aGlzKiBzdWJzY3JpYmVyIGNvbXBsZXRlbHkqL1xuLyogbG9zc2xlc3MgcmVxdWlyZXMgZWFnZXIgY29uc3VtcHRpb24gb2YgdGhlIGZvcm1lci4qL1xuLyogU3VjaCBsb3NzbGVzc25lc3MgaW5oaWJpdHMgR0MsIHdoaWNoIGlzIHdoeSB3ZSdyZSBtb3ZpbmcgYXdheSBmcm9tIGl0LiovXG5jb25zdCBwdWJMaXN0PXN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKTtcbmNvbnN0IHN1YnNjcmlwdGlvbj1tYWtlU3Vic2NyaXB0aW9uKHB1Ykxpc3QpO1xuXG4vKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6cHVibGlzaGVyLnB1Ymxpc2gsXG5maW5pc2g6cHVibGlzaGVyLmZpbmlzaCxcbmZhaWw6cHVibGlzaGVyLmZhaWx9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259KTtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG3m3zOlIQAApSEAACwAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxUPn0gUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVwcmVjYXRlZC4gVXNlIFByb21pc2VLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZVJlY29yZDxUPn0gUHJvbWlzZVJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IEFzeW5jSXRlcmF0b3I8VCwgVD5cbiAqIH19IENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlXG4gKiBBbiBBc3luY0l0ZXJhYmxlIHRoYXQgcmV0dXJucyB0aGUgc2FtZSB0eXBlIGFzIGl0IHlpZWxkcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJdGVyYXRpb25PYnNlcnZlcjxUPlxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgdXBkYXRlU3RhdGVgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHVwZGF0ZVN0YXRlXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaWNhdGlvblJlY29yZFxuICogQHByb3BlcnR5IHtJdGVyYXRvclJlc3VsdDxUPn0gaGVhZFxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudFxuICogQHByb3BlcnR5IHtQdWJsaWNhdGlvbkxpc3Q8VD59IHRhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IFB1YmxpY2F0aW9uTGlzdFxuICogV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcywgc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyXG4gKiBzb2Z0d2FyZSBzaG91bGQgY29uc2lkZXIgaXQgb3BhcXVlLCBub3QgZGVwZW5kaW5nIG9uIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaWJlclxuICogQHByb3BlcnR5IHsocHVibGlzaENvdW50PzogYmlnaW50KSA9PiBQdWJsaWNhdGlvbkxpc3Q8VD59IHN1YnNjcmliZUFmdGVyXG4gKiBJbnRlcm5hbGx5IHVzZWQgdG8gZ2V0IHRoZSBcImN1cnJlbnRcIiBTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsc1xuICogaW4gb3JkZXIgdG8gbWFrZSBhIHN1YnNjcmlwdGlvbiBpdGVyYXRvciB0aGF0IHN0YXJ0cyB0aGVyZS5cbiAqIFRoZSBhbnN3ZXIgaXMgXCJjdXJyZW50XCIgaW4gdGhhdCBpdCB3YXMgYWNjdXJhdGUgYXQgc29tZSBtb21lbnQgYmV0d2VlblxuICogd2hlbiB5b3UgYXNrZWQgYW5kIHdoZW4geW91IGdvdCB0aGUgYW5zd2VyLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hlclxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgcHVibGlzaGAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gcHVibGlzaFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IGFueSkgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFB1Ymxpc2hlcjxUPj59IFB1Ymxpc2hPYnNlcnZlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETzogTmFycm93IHRvIGV4Y2x1ZGUgbnVtYmVyLiovXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWR9IFVwZGF0ZUNvdW50IGEgdmFsdWUgdXNlZCB0byBtYXJrIHRoZSBwb3NpdGlvblxuICogaW4gdGhlIHVwZGF0ZSBzdHJlYW0uIEZvciB0aGUgbGFzdCBzdGF0ZSwgdGhlIHVwZGF0ZUNvdW50IGlzIHVuZGVmaW5lZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVcGRhdGVSZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7VH0gdmFsdWUgaXMgd2hhdGV2ZXIgc3RhdGUgdGhlIHNlcnZpY2Ugd2FudHMgdG8gcHVibGlzaFxuICogQHByb3BlcnR5IHtVcGRhdGVDb3VudH0gdXBkYXRlQ291bnQgaXMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHVwZGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBHZXRVcGRhdGVTaW5jZTxUPiBDYW4gYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gZ2V0IGEgc2VxdWVuY2Ugb2ZcbiAqIHVwZGF0ZSByZWNvcmRzXG4gKiBAcGFyYW0ge1VwZGF0ZUNvdW50fSBbdXBkYXRlQ291bnRdIHJldHVybiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuIHVwZGF0ZVxuICogY291bnQuIElmIHRoZSBgdXBkYXRlQ291bnRgIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50XG4gKiB1cGRhdGUgY291bnQsIHJldHVybiB0aGUgY3VycmVudCByZWNvcmQuXG4gKiBPdGhlcndpc2UsIGFmdGVyIHRoZSBuZXh0IHN0YXRlIGNoYW5nZSwgdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIHRvIHRoZVxuICogdGhlbi1jdXJyZW50IHZhbHVlIG9mIHRoZSByZWNvcmQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSByZXNvbHZlcyB0byB0aGUgY29ycmVzcG9uZGluZ1xuICogdXBkYXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gQmFzZU5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGVcbiAqIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICogQHByb3BlcnR5IHtHZXRVcGRhdGVTaW5jZTxUPn0gZ2V0VXBkYXRlU2luY2UgcmV0dXJuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW5cbiAqIHVwZGF0ZSBjb3VudC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+fSBOb3RpZmllckludGVybmFscyBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLFxuICogc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyIHNvZnR3YXJlIHNob3VsZCBhdm9pZCBkZXBlbmRpbmcgb25cbiAqIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmXG4gKiAgIENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+ICZcbiAqICAgU2hhcmFibGVOb3RpZmllcjxUPlxuICogfSBOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxOb3RpZmllckludGVybmFsczxUPj59IGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBOb3RpZmljYXRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VOb3RpZmllcihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpZXJSZWNvcmQ8VD4gdGhlIHByb2R1Y2VkIG5vdGlmaWVyL3VwZGF0ZXIgcGFpclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gdXBkYXRlciB0aGUgKGNsb3NlbHktaGVsZCkgbm90aWZpZXIgcHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8VD59IG5vdGlmaWVyIHRoZSAod2lkZWx5LWhlbGQpIG5vdGlmaWVyIGNvbnN1bWVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD4gJlxuICogICBTaGFyYWJsZVN1YnNjcmlwdGlvbjxUPn0gU3Vic2NyaXB0aW9uPFQ+XG4gKiBBIGZvcm0gb2YgQXN5bmNJdGVyYWJsZSBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVTdWJzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgU3Vic2NyaXB0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlU3Vic2NyaXB0aW9uKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0FzeW5jSXRlcmF0b3I8VCwgVD4gJiBDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPn0gU3Vic2NyaXB0aW9uSXRlcmF0b3I8VD5cbiAqIGFuIEFzeW5jSXRlcmF0b3Igc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVcbiAqIEdldCBhIG5ldyBzdWJzY3JpcHRpb24gd2hvc2Ugc3RhcnRpbmcgcG9zaXRpb24gaXMgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnRcbiAqIHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN1YnNjcmlwdGlvblJlY29yZDxUPlxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGljYXRpb25cbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAndW5zZXJpYWxpemUnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICovXG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3MgU0RLLlxuICpcbiAqIFZzdG9yYWdlIGlzIGEgaGllcmFyY2hpY2FsIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JhZ2Ugc3RydWN0dXJlIHRoYXRcbiAqIGlkZW50aWZpZXMgY2hpbGRyZW4gYnkgcmVzdHJpY3RlZCBBU0NJSSBuYW1lIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYXJiaXRyYXJ5XG4gKiBzdHJpbmctdmFsdWVkIGRhdGEgZm9yIGVhY2ggbm9kZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JhZ2VOb2RlXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBzdHJpbmcpID0+IHZvaWR9IHNldFZhbHVlIHB1Ymxpc2hlcyBzb21lIGRhdGFcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IGdldCB0aGVcbiAqIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JlIGtleSBmb3IgdGhpcyBzdG9yYWdlIGl0ZW1cbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdGg6IHN0cmluZywgb3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IGdldCB0aGUgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmUga2V5XG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmlwdGlvbjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaWJlcjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpYmVyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1tYqM5UBAACVAQAAIAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEGauoGCIAABgiAAAhAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4va2V5cy9jaGVja0tleS5qcyIsIi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4va2V5cy9jb3B5QmFnLmpzIiwiLi9rZXlzL2NvcHlTZXQuanMiLCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4va2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIiwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsIi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qcyIsIi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJNIiwiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5UGF0dGVybiIsImFzc2VydFBhdHRlcm4iLCJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiIsImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvRWxlbWVudHMiLCJjb21wYXJlS2V5cyIsImNvbXBhcmVSYW5rIiwiZGVmYXVsdCIsImRlZmVuZFByb3RvdHlwZSIsImRlZmluZUhlYXBGYXJDbGFzcyIsImRlZmluZUhlYXBGYXJDbGFzc0tpdCIsImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsImZpdCIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5U2V0S2V5cyIsImdldFJhbmtDb3ZlciIsImluaXRFbXB0eSIsImlzRW5jb2RlZFJlbW90YWJsZSIsImlzS2V5IiwiaXNQYXR0ZXJuIiwiaXNSYW5rU29ydGVkIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlSGVhcEZhckluc3RhbmNlIiwibWFrZUxlZ2FjeU1hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIiwibWFrZVNjYWxhck1hcCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmUiLCJtYWtlV2Vha1N0b3JlIiwibWF0Y2hlcyIsInByb3ZpZGVMYXp5Iiwic2V0Q29tcGFyZSIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiIsInNvcnRCeVJhbmsiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJpc0tleVwiLCBbJGjigI1fbGl2ZVtcImlzS2V5XCJdXV0sW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0S2V5XCJdXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQ29weVNldFwiXV1dLFtcImdldENvcHlTZXRLZXlzXCIsIFskaOKAjV9saXZlW1wiZ2V0Q29weVNldEtleXNcIl1dXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnXCJdXV0sW1wibWFrZUNvcHlCYWdGcm9tRWxlbWVudHNcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiXV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9saXZlW1wiZ2V0Q29weUJhZ0VudHJpZXNcIl1dXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5TWFwXCJdXV0sW1wiZ2V0Q29weU1hcEVudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5TWFwRW50cmllc1wiXV1dXV0sW1wiLi9rZXlzL2NvcHlTZXQuanNcIiwgW1tcImNvZXJjZVRvRWxlbWVudHNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0VsZW1lbnRzXCJdXV1dXSxbXCIuL2tleXMvY29weUJhZy5qc1wiLCBbW1wiY29lcmNlVG9CYWdFbnRyaWVzXCIsIFskaOKAjV9saXZlW1wiY29lcmNlVG9CYWdFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImNvbXBhcmVLZXlzXCIsIFskaOKAjV9saXZlW1wiY29tcGFyZUtleXNcIl1dXSxbXCJrZXlMVFwiLCBbJGjigI1fbGl2ZVtcImtleUxUXCJdXV0sW1wia2V5TFRFXCIsIFskaOKAjV9saXZlW1wia2V5TFRFXCJdXV0sW1wia2V5RVFcIiwgWyRo4oCNX2xpdmVbXCJrZXlFUVwiXV1dLFtcImtleUdURVwiLCBbJGjigI1fbGl2ZVtcImtleUdURVwiXV1dLFtcImtleUdUXCIsIFskaOKAjV9saXZlW1wia2V5R1RcIl1dXV1dLFtcIi4va2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0lzU3VwZXJzZXRcIl1dXSxbXCJlbGVtZW50c0lzRGlzam9pbnRcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0lzRGlzam9pbnRcIl1dXSxbXCJlbGVtZW50c0NvbXBhcmVcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0NvbXBhcmVcIl1dXSxbXCJlbGVtZW50c1VuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNVbmlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiXV1dLFtcImVsZW1lbnRzSW50ZXJzZWN0aW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIl1dXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIl1dXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9saXZlW1wic2V0SXNTdXBlcnNldFwiXV1dLFtcInNldElzRGlzam9pbnRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc0Rpc2pvaW50XCJdXV0sW1wic2V0Q29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcInNldENvbXBhcmVcIl1dXSxbXCJzZXRVbmlvblwiLCBbJGjigI1fbGl2ZVtcInNldFVuaW9uXCJdXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLCBbJGjigI1fbGl2ZVtcInNldERpc2pvaW50VW5pb25cIl1dXSxbXCJzZXRJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJzZXRJbnRlcnNlY3Rpb25cIl1dXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW1tcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2xpdmVbXCJiYWdJc1N1cGVyYmFnXCJdXV0sW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImJhZ0NvbXBhcmVcIl1dXSxbXCJiYWdVbmlvblwiLCBbJGjigI1fbGl2ZVtcImJhZ1VuaW9uXCJdXV0sW1wiYmFnSW50ZXJzZWN0aW9uXCIsIFskaOKAjV9saXZlW1wiYmFnSW50ZXJzZWN0aW9uXCJdXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIl1dXV1dLFtcIi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJNXCIsIFskaOKAjV9saXZlW1wiTVwiXV1dLFtcImdldFJhbmtDb3ZlclwiLCBbJGjigI1fbGl2ZVtcImdldFJhbmtDb3ZlclwiXV1dLFtcImlzUGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImlzUGF0dGVyblwiXV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0S2V5UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydEtleVBhdHRlcm5cIl1dXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9saXZlW1wibWF0Y2hlc1wiXV1dLFtcImZpdFwiLCBbJGjigI1fbGl2ZVtcImZpdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLCBbJGjigI1fbGl2ZVtcImRlZmVuZFByb3RvdHlwZVwiXV1dLFtcImluaXRFbXB0eVwiLCBbJGjigI1fbGl2ZVtcImluaXRFbXB0eVwiXV1dLFtcImRlZmluZUhlYXBGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUhlYXBGYXJDbGFzc1wiXV1dLFtcImRlZmluZUhlYXBGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUhlYXBGYXJDbGFzc0tpdFwiXV1dLFtcIm1ha2VIZWFwRmFySW5zdGFuY2VcIiwgWyRo4oCNX2xpdmVbXCJtYWtlSGVhcEZhckluc3RhbmNlXCJdXV1dXSxbXCIuL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlUmFua1wiXV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fbGl2ZVtcImlzUmFua1NvcnRlZFwiXV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2xpdmVbXCJzb3J0QnlSYW5rXCJdXV1dXSxbXCIuL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJtYWtlRGVjb2RlUGFzc2FibGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlRGVjb2RlUGFzc2FibGVcIl1dXSxbXCJtYWtlRW5jb2RlUGFzc2FibGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlRW5jb2RlUGFzc2FibGVcIl1dXSxbXCJpc0VuY29kZWRSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJpc0VuY29kZWRSZW1vdGFibGVcIl1dXSxbXCJ6ZXJvUGFkXCIsIFskaOKAjV9saXZlW1wiemVyb1BhZFwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXSwkaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXSwkaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXSwkaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl1dXV1dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVMYXp5XCJdXV1dXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lNYXBcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTGVnYWN5TWFwXCJdLCRo4oCNX2xpdmVbXCJtYWtlTGVnYWN5TWFwXCJdXV1dXSxbXCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzXCIsIFtbXCJtYWtlTGVnYWN5V2Vha01hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lXZWFrTWFwXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImlzS2V5IjpbImlzS2V5IixmYWxzZV0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiLGZhbHNlXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiLGZhbHNlXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiLGZhbHNlXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciLGZhbHNlXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLGZhbHNlXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiLGZhbHNlXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiLGZhbHNlXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiLGZhbHNlXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIixmYWxzZV0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiLGZhbHNlXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiLGZhbHNlXSwia2V5TFQiOlsia2V5TFQiLGZhbHNlXSwia2V5TFRFIjpbImtleUxURSIsZmFsc2VdLCJrZXlFUSI6WyJrZXlFUSIsZmFsc2VdLCJrZXlHVEUiOlsia2V5R1RFIixmYWxzZV0sImtleUdUIjpbImtleUdUIixmYWxzZV0sImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiLGZhbHNlXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCIsZmFsc2VdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIixmYWxzZV0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiIsZmFsc2VdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIixmYWxzZV0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0IixmYWxzZV0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCIsZmFsc2VdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiLGZhbHNlXSwic2V0VW5pb24iOlsic2V0VW5pb24iLGZhbHNlXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIixmYWxzZV0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iLGZhbHNlXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0IixmYWxzZV0sImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyIsZmFsc2VdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiLGZhbHNlXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iLGZhbHNlXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiIsZmFsc2VdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiTSI6WyJNIixmYWxzZV0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiLGZhbHNlXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiIsZmFsc2VdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iLGZhbHNlXSwiYXNzZXJ0S2V5UGF0dGVybiI6WyJhc3NlcnRLZXlQYXR0ZXJuIixmYWxzZV0sIm1hdGNoZXMiOlsibWF0Y2hlcyIsZmFsc2VdLCJmaXQiOlsiZml0IixmYWxzZV0sImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiLGZhbHNlXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSIsZmFsc2VdLCJkZWZpbmVIZWFwRmFyQ2xhc3MiOlsiZGVmaW5lSGVhcEZhckNsYXNzIixmYWxzZV0sImRlZmluZUhlYXBGYXJDbGFzc0tpdCI6WyJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiLGZhbHNlXSwibWFrZUhlYXBGYXJJbnN0YW5jZSI6WyJtYWtlSGVhcEZhckluc3RhbmNlIixmYWxzZV0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIixmYWxzZV0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiLGZhbHNlXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIixmYWxzZV0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiLGZhbHNlXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSIsZmFsc2VdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIixmYWxzZV0sInplcm9QYWQiOlsiemVyb1BhZCIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXAiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlV2Vha1N0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5IixmYWxzZV0sIm1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCIsZmFsc2VdLCJkZWZhdWx0IjpbIm1ha2VMZWdhY3lNYXAiLGZhbHNlXSwibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIQT5lIJDAACCQwAAKQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY29weUJhZy5qcyIsIi4vY29weVNldC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFByaW1pdGl2ZUtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsYXNzZXJ0UGFzc2FibGUsRmFyLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGlkZW50Q2hlY2tlcixjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJjaGVja0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjaGVja0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJjaGVja0JhZ0VudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gUHJpbWl0aXZlIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQcmltaXRpdmVLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzT2JqZWN0KHZhbCkpe1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YCkpO1xuXG4gfVxuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzUHJpbWl0aXZlS2V5KGlzUHJpbWl0aXZlS2V5KTtcbmhhcmRlbihpc1ByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbmNvbnN0ICAgICAgICBpc1NjYWxhcktleT0odmFsKT0+Y2hlY2tTY2FsYXJLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbmNvbnN0IGtleU1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbi8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlTZXQ8S2V5Pj4gKi9cbmNvbnN0IGNvcHlTZXRNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlTZXQ9KHMsY2hlY2spPT57XG5pZihjb3B5U2V0TWVtby5oYXMocykpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKHMpPT09J3RhZ2dlZCcmJmdldFRhZyhzKT09PSdjb3B5U2V0J3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpJiZcbmNoZWNrRWxlbWVudHMocy5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShzLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlTZXRNZW1vLmFkZChzKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXQ8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weVNldH0gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5jaGVja0NvcHlTZXQocyxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5oYXJkZW4oaXNDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge2Fzc2VydHMgcyBpcyBDb3B5U2V0PEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlTZXQ9KHMpPT57XG5jaGVja0NvcHlTZXQocyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weVNldEtleXM9KHMpPT57XG5hc3NlcnRDb3B5U2V0KHMpO1xucmV0dXJuIHMucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weVNldEtleT0ocyxmbik9PlxuZ2V0Q29weVNldEtleXMocykuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlTZXQ9KGVsZW1lbnRJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRJdGVyKTtcbmFzc2VydENvcHlTZXQocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5QmFnPEtleT4+ICovXG5jb25zdCBjb3B5QmFnTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5QmFnPShiLGNoZWNrKT0+e1xuaWYoY29weUJhZ01lbW8uaGFzKGIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihiKT09PSd0YWdnZWQnJiZnZXRUYWcoYik9PT0nY29weUJhZyd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weUJhZzogJHtifWApKSYmXG5jaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShiLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlCYWdNZW1vLmFkZChiKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtiIGlzIENvcHlCYWc8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWc9KGIpPT5jaGVja0NvcHlCYWcoYixpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnPEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5QmFnfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlCYWc9KGIpPT57XG5jaGVja0NvcHlCYWcoYixhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPlsncGF5bG9hZCddfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weUJhZ0VudHJpZXM9KGIpPT57XG5hc3NlcnRDb3B5QmFnKGIpO1xucmV0dXJuIGIucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weUJhZ0VudHJpZXMoZ2V0Q29weUJhZ0VudHJpZXMpO1xuaGFyZGVuKGdldENvcHlCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcGFyYW0geyhlbnRyeTogW0ssIGJpZ2ludF0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weUJhZ0VudHJ5PShiLGZuKT0+XG5nZXRDb3B5QmFnRW50cmllcyhiKS5ldmVyeSgoZW50cnksaW5kZXgpPT5mbihlbnRyeSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5QmFnRW50cnkoZXZlcnlDb3B5QmFnRW50cnkpO1xuaGFyZGVuKGV2ZXJ5Q29weUJhZ0VudHJ5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnPShiYWdFbnRyeUl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZUJhZ09mRW50cmllcyhiYWdFbnRyeUl0ZXIpO1xuYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWdGcm9tRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5jb25zdCBzb3J0ZWQ9c29ydEJ5UmFuayhlbGVtZW50SXRlcixmdWxsQ29tcGFyZSk7XG4vKiogQHR5cGUge1tLLGJpZ2ludF1bXX0gKi9cbmNvbnN0IGVudHJpZXM9W107XG5mb3IobGV0IGk9MDtpPHNvcnRlZC5sZW5ndGg7KXtcbmNvbnN0IGs9c29ydGVkW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxzb3J0ZWQubGVuZ3RoJiZmdWxsQ29tcGFyZShrLHNvcnRlZFtqXSk9PT0wKXtcbmorPTE7XG4gfVxuZW50cmllcy5wdXNoKFtrLEJpZ0ludChqLWkpXSk7XG5pPWo7XG4gfVxucmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlNYXAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weU1hcCdzIGtleXMgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlNYXA8YW55LGFueT4+ICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlNYXB9ICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlNYXB9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEtleXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcFZhbHVlcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PWtleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBLZXk9KG0sZm4pPT5cbmdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KHZhbHVlOiBWLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZT0obSxmbik9PlxuZ2V0Q29weU1hcFZhbHVlcyhtKS5ldmVyeSgodmFsdWUsaW5kZXgpPT5mbih2YWx1ZSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5TWFwS2V5U2V0PShtKT0+XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaOKAjV9vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbi8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbi8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuLyogVE9ETyBUaGlzKi9cbi8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbi8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuY29uc3Qgc29ydGVkRW50cmllcz1zb3J0QnlSYW5rKGVudHJpZXMsY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0IGtleXM9c29ydGVkRW50cmllcy5tYXAoKFtrLF92XSk9PmspO1xuY29uc3QgdmFsdWVzPXNvcnRlZEVudHJpZXMubWFwKChbX2ssdl0pPT52KTtcbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdjb3B5TWFwJyx7a2V5cyx2YWx1ZXN9KTtcbmFzc2VydENvcHlNYXAocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbi8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbi8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBBbGwgcmVtb3RhYmxlcyBhcmUga2V5cy4qL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJpbWl0aXZlS2V5IjpbImlzUHJpbWl0aXZlS2V5Il0sImFzc2VydFByaW1pdGl2ZUtleSI6WyJhc3NlcnRQcmltaXRpdmVLZXkiXSwiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADRody3KGgAAyhoAACwAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY2hlY2tLZXkuanMiLCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxhc3NlcnRLZXksYmFnQ29tcGFyZSxzZXRDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9hID0+IChiYWdDb21wYXJlID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbW1wic2V0Q29tcGFyZVwiLCBbJGjigI1fYSA9PiAoc2V0Q29tcGFyZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge0tleUNvbXBhcmV9ICovXG5jb25zdCAgICAgICAgY29tcGFyZUtleXM9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRLZXkobGVmdCk7XG5hc3NlcnRLZXkocmlnaHQpO1xuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbi8qIERpZmZlcmVudCBwYXNzU3R5bGVzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6e1xuLyogZm9yIHRoZXNlLCBrZXlzIGNvbXBhcmUgdGhlIHNhbWUgYXMgcmFuayovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdudW1iZXInOntcbmNvbnN0IHJhbmtDb21wPWNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuaWYocmFua0NvbXA9PT0wKXtcbnJldHVybiAwO1xuIH1cbmlmKE51bWJlci5pc05hTihsZWZ0KXx8TnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG4vKiBOYU4gaXMgZXF1YWwgdG8gaXRzZWxmLCBidXQgaW5jb21tZW5zdXJhdGUgd2l0aCBldmVyeXRoaW5nIGVsc2UqL1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCl8fCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiBOYU47XG4gfVxuLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbi8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xucmV0dXJuIHJhbmtDb21wO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5pZihsZWZ0PT09cmlnaHQpe1xucmV0dXJuIDA7XG4gfVxuLyogSWYgdHdvIHJlbW90YWJsZXMgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gYXMga2V5cyB0aGV5IGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4qL1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBrZXkgb3JkZXIuIFJhbmsgb3JkZXIgb2YgYXJyYXlzIGlzIGxleGljb2dyYXBoaWMgYnkqL1xuLyogcmFuayBvcmRlci4qL1xuLyogQmVjYXVzZSB0aGUgaW52YXJpYW50cyBhYm92ZSBhcHBseSB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LCovXG4vKiB0aGV5IGFwcGx5IHRvIHRoZSBhcnJheSBhcyBhIHdob2xlLiovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmVLZXlzKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFrZXlFUShsZWZ0TmFtZXMscmlnaHROYW1lcykpe1xuLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbi8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4vKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4vKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4vKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xucmV0dXJuIE5hTjtcbiB9XG5jb25zdCBsZWZ0VmFsdWVzPXJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyk7XG5jb25zdCByaWdodFZhbHVlcz1yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcyk7XG4vKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4vKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xubGV0IHJlc3VsdD0wO1xuZm9yKGxldCBpPTA7aTxsZWZ0VmFsdWVzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXA9Y29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSxyaWdodFZhbHVlc1tpXSk7XG5pZihOdW1iZXIuaXNOYU4oY29tcCkpe1xucmV0dXJuIE5hTjtcbiB9XG5pZihyZXN1bHQhPT1jb21wJiZjb21wIT09MCl7XG5pZihyZXN1bHQ9PT0wKXtcbnJlc3VsdD1jb21wO1xuIH1lbHNle1xuYXNzZXJ0KFxucmVzdWx0PT09LTEmJmNvbXA9PT0xfHxyZXN1bHQ9PT0xJiZjb21wPT09LTEpO1xuXG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4gfVxuLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbi8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbi8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4vKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4vKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuLyogcHJvcGVydHkgbmFtZXMuKi9cbi8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG5jb25zdCByaWdodFRhZz1nZXRUYWcocmlnaHQpO1xuaWYobGVmdFRhZyE9PXJpZ2h0VGFnKXtcbi8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0VGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogY29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5U2V0IFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogaXMga2V5RVEgdG8gc29tZSBlbGVtZW50IG9mIFkgYW5kIHNvbWUgZWxlbWVudCBvZiBZIGlzKi9cbi8qIG5vdCBrZXlFUSB0byBhbnkgZWxlbWVudCBvZiBYLiovXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8qIGNvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gY29weUJhZyBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIG9jY3VycyBubyBtb3JlIHRoYW4gdGhlIGtleUVRIGVsZW1lbnQgb2YgWSwgYW5kIHNvbWUgZWxlbWVudCovXG4vKiBvZiBZIG9jY3VycyBtb3JlIHRoYW4gc29tZSBlbGVtZW50IG9mIFgsIHdoZXJlIGJlaW5nIGFic2VudCovXG4vKiBmcm9tIFggY291bnRzIGFzIG9jY3VycmluZyB6ZXJvIHRpbWVzLiovXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFR3byBjb3B5TWFwcyB0aGF0IGhhdmUgZGlmZmVyZW50IGtleXMgKGFjY29yZGluZyB0byBrZXlFUSkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiBUaGUgcmVwcmVzZW50YXRpb24gb2YgY29weU1hcHMgaW5jbHVkZXMgdGhlIGtleXMqL1xuLyogZmlyc3QsIGluIHRoZSBzYW1lIHJldmVyc2UgcmFuayBvcmRlciB1c2VkIGJ5IHNldHMuIFRodXMsIGFsbCovXG4vKiBjb3B5TWFwcyB3aXRoIGtleXMgb2YgdGhlIHNhbWUgcmFuayAod2hpY2ggaXMqL1xuLyogbGVzcyBwcmVjaXNlISkgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyIHdoZW4gY29weU1hcHMgYXJlIHNvcnRlZCovXG4vKiBieSByYW5rLCBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YgbWlzc2VzIHdoZW4gcmFuZ2Ugc2VhcmNoaW5nLiovXG4vKiovXG4vKiBBbW9uZyBjb3B5TWFwcyB3aXRoIHRoZSBzYW1lIGtleXMgKGFjY29yZGluZyB0byBrZXlFUSksIHRoZXkqL1xuLyogY29tcGFyZSBieSBhIGNvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvZiB0aGVpciB2YWx1ZXMuIFRodXMsIGFzKi9cbi8qIHdpdGggcmVjb3JkcywgZm9yIHR3byBjb3B5TWFwcyBYIGFuZCBZLCBpZiBgY29tcGFyZUtleXMoWCxZKSA8Ki9cbi8qIDBgIHRoZW4sIGJlY2F1c2UgdGhlc2UgdmFsdWVzIG9iZXkgdGhlIGFib3ZlIGludmFyaWFudHMsIG5vbmUgb2YqL1xuLyogdGhlIHZhbHVlcyBpbiBYIGhhdmUgYSBsYXRlciByYW5rIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUqL1xuLyogb2YgWS4gVGh1cywgYGNvbXBhcmVSYW5rKFgsWSkgPD0gMGAuIFRPRE8gaW1wbGVtZW50Ki9cbnRocm93IEZhaWwgYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbmNvbnN0ICAgICAgICBrZXlMVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPDA7JGjigI1fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjigI1fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG5jb25zdCAgICAgICAga2V5RVE9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT09PTA7JGjigI1fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG5jb25zdCAgICAgICAga2V5R1RFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+PTA7JGjigI1fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRo4oCNX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATIvipA4TAAAOEwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHlcbiAqIGtub3duIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0XG4gKiByYXRoZXIgdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZVxuICogYXJyYXkgZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUta2V5cyBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4vKiBTaW5jZSB0aGUga2V5IGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB0aGUgdmFsdWUgKHRoZSBjb3VudCksKi9cbi8qIHNvcnRpbmcgYnkgZnVsbE9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBkdXBsaWNhdGUga2V5cyovXG4vKiBhZGphY2VudCBpbmRlcGVuZGVudCBvZiB0aGVpciBjb3VudHMuKi9cbmJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9YmFnRW50cmllc1tpLTFdWzBdO1xuY29uc3QgazE9YmFnRW50cmllc1tpXVswXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmU9fSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuY29uc3QgICAgICAgIGNoZWNrQmFnRW50cmllcz0oYmFnRW50cmllcyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5mb3IoY29uc3QgZW50cnkgb2YgYmFnRW50cmllcyl7XG5pZihcbnBhc3NTdHlsZU9mKGVudHJ5KSE9PSdjb3B5QXJyYXknfHxcbmVudHJ5Lmxlbmd0aCE9PTJ8fFxudHlwZW9mIGVudHJ5WzFdIT09J2JpZ2ludCcpXG57XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG5pZihlbnRyeVsxXTwxKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayAtLSBkb2Vzbid0IHVuZGVyc3RhbmQgYXNzZXJ0cyovXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHJldHVybnMge2Fzc2VydHMgYmFnRW50cmllcyBpcyBbUGFzc2FibGUsYmlnaW50XVtdfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0QmFnRW50cmllcz0oYmFnRW50cmllcyk9PntcbmNoZWNrQmFnRW50cmllcyhiYWdFbnRyaWVzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9CYWdFbnRyaWVzPShiYWdFbnRyaWVzTGlzdCk9PntcbmNvbnN0IGJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbnJldHVybiBiYWdFbnRyaWVzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VCYWdPZkVudHJpZXM9KGJhZ0VudHJ5SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weUJhZycsY29lcmNlVG9CYWdFbnRyaWVzKGJhZ0VudHJ5SXRlcikpOyRo4oCNX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI6EjZOHDwAAhw8AACgAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IGtub3duXG4gKiB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdCByYXRoZXJcbiAqIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmUgYXJyYXlcbiAqIGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5lbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWVsZW1lbnRzW2ktMV07XG5jb25zdCBrMT1lbGVtZW50c1tpXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGVzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmU9fSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABLdXk4GiIAABoiAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgcmF0aGVyIHRoYW4qL1xuLyogZHVwbGljYXRpbmcgd2l0aCBjaGFuZ2VzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydD0oYmFnRW50cmllcyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IGVudHJ5PWJhZ0VudHJpZXNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShcbmo8bGVuZ3RoJiZcbnJhbmtDb21wYXJlKGVudHJ5WzBdLGJhZ0VudHJpZXNbal1bMF0pPT09MClcbntcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOmVudHJ5fSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1iYWdFbnRyaWVzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6W251bGwsMG5dfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9YmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz1iYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4YztcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHljO1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnhEb25lLFxudmFsdWU6W3gseGNdfT1cbnhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eURvbmUsXG52YWx1ZTpbeSx5Y119PVxueWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCx4Yyx5Y107XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZz0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc0Rpc2pvaW50IGFzIHdlbGwuKi9cbi8qIFRoZSBjb2RlIGlzIGlkZW50aWNhbC4qL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVyQ29tcGFyZSBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuY29uc3QgYmFnSXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHhjPnljKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuY29uc3QgYmFnSXRlclVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xucmVzdWx0LnB1c2goW20seGMreWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yzw9eWM/eGM6eWM7XG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yy15Yztcbm1jPj0wbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZihtYz49MW4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGJhZ0l0ZXJPcCk9Pih4YmFnRW50cmllcyx5YmFnRW50cmllcyk9PlxuYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKSk7XG5cbmNvbnN0IGJhZ0VudHJpZXNJc1N1cGVyYmFnPW1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50PW1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNDb21wYXJlPW1lcmdlaWZ5KGJhZ0l0ZXJDb21wYXJlKTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbj1tZXJnZWlmeShiYWdJdGVyVW5pb24pO1xuY29uc3QgYmFnRW50cmllc0ludGVyc2VjdGlvbj1tZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5iYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxubWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgYmFnSXNTdXBlcmJhZz1yYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRo4oCNX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbmNvbnN0ICAgICAgICBiYWdJc0Rpc2pvaW50PXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNEaXNqb2ludCk7JGjigI1fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGJhZ0NvbXBhcmU9cmF3QmFnaWZ5KGJhZ0VudHJpZXNDb21wYXJlKTskaOKAjV9vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5jb25zdCAgICAgICAgYmFnVW5pb249YmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjigI1fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG5jb25zdCAgICAgICAgYmFnSW50ZXJzZWN0aW9uPWJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGJhZ0Rpc2pvaW50U3VidHJhY3Q9YmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlMrdq60lAACtJQAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jb3B5U2V0LmpzIl0sImV4cG9ydHMiOlsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwic2V0Q29tcGFyZSIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaOKAjV9pbXBvcnRzKFtbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgZWxlbWVudHNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmUgdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgZWxlbWVudHMgdGllZCBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGVsZW1lbnRzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgZWxlbWVudHNgIGFycmF5IGFjY29yZGluZ1xuICogIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCB3aW5kb3dSZXNvcnQ9KGVsZW1lbnRzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCB2YWx1ZT1lbGVtZW50c1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8bGVuZ3RoJiZyYW5rQ29tcGFyZSh2YWx1ZSxlbGVtZW50c1tqXSk9PT0wKXtcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1lbGVtZW50cy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOm51bGx9KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSB4ZWxlbWVudHNcbiAqIEBwYXJhbSB7VFtdfSB5ZWxlbWVudHNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4ZWxlbWVudHMseWVsZW1lbnRzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9d2luZG93UmVzb3J0KHhlbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9d2luZG93UmVzb3J0KHllbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2UgZm91ciBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7ZG9uZTp4RG9uZSx2YWx1ZTp4fT14aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7ZG9uZTp5RG9uZSx2YWx1ZTp5fT15aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LDFuLDFuXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLF95Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuY29uc3QgaXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbmNvbnN0IGl0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4vKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM9PT0wbnx8eWM9PT0wbnx8RmFpbCBgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG5pZih4Yz49MW4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MW58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz49MW58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYoeWM9PT0wbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGl0ZXJPcCk9Pih4ZWxlbWVudHMseWVsZW1lbnRzKT0+XG5pdGVyT3AobWVyZ2UoeGVsZW1lbnRzLHllbGVtZW50cykpO1xuXG5jb25zdCAgICAgICAgZWxlbWVudHNJc1N1cGVyc2V0PW1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjigI1fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRo4oCNX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG5jb25zdCAgICAgICAgZWxlbWVudHNVbmlvbj1tZXJnZWlmeShpdGVyVW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjigI1fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjigI1fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjigI1fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9cmF3U2V0aWZ5KGVsZW1lbnRzQ29tcGFyZSk7JGjigI1fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuY29uc3QgICAgICAgIHNldFVuaW9uPXNldGlmeShlbGVtZW50c1VuaW9uKTskaOKAjV9vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50U3VidHJhY3Q9c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgYW5kIGl0cyBmcmF0ZXJuYWwgc2libGluZyBsZWdhY3lXZWFrTWFwIGV4aXN0IG9ubHkgdG9cbiAqIGVhc2UgYSB0cmFuc2l0aW9uIHRvIHRoZSBtb2Rlcm4gYHN0b3JlYCBzeXN0ZW0sIGFyZSBkZXByZWNhdGVkLFxuICogYW5kIHdpbGwgZXZlbnR1YWxseSBkaXNhcHBlYXIuIFRoZXkgYXJlIG5lZWRlZCBmb3Igbm93IHRvIHN1cHBvcnRcbiAqIHNvbWUgb2YgdGhlIHVzZXMgb2YgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoXG4gKiB0aGUgbmV3LiBUaGUgY29uc3RyYWludCBpbXBvc2VkIGJ5IHRoZSBuZXcgaXMgdGhhdCBvbmx5IHBhc3NhYmxlcyBjYW5cbiAqIGJlIHVzZWQgYXMgdmFsdWVzLCBhbmQgb25seSBrZXlzIChyb3VnaGx5LCBzdHJ1Y3R1cmVzLCBha2EgY29tcGFyYWJsZXMpXG4gKiBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzM1NjdcbiAqIFRPRE8gT25jZSB0aGF0IFBSIGlzIG1lcmdlZCwgbGluayB0byB0aGUgZG9jdW1lbnRzIHJhdGhlciB0aGFuIHRoZSBQUnMuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBub24tY29uZm9ybWluZyB1c2VzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCBhXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICogY29tbWVudCBleHBsYWluaW5nIHRoZSBwcm9ibGVtIGluaGliaXRpbmcgY29udmVyc2lvbiB0byB0aGUgbmV3XG4gKiBzeXN0ZW0uIFNvbWUgb2YgdGhlc2UgcHJvYmxlbXMgYXMgb2YgdGhpcyB3cml0aW5nOlxuICogICAgKiBBIHByb21pc2VLaXQgdXNlZCBhcyBhIHZhbHVlLCBldmVuIHRob3VnaCBhIHByb21pc2VLaXQgaXMgbm90XG4gKiAgICAgIGEgcGFzc2FibGUuIFNvbHV0aW9ucyBhcmUgdG8gbWFrZSBpdCBhIHBhc3NhYmxlLCBvciB0byBjb252ZXJ0XG4gKiAgICAgIHRoZSBjb250YWluZXIgYmFjayB0byBhIGNvbnZlbnRpb25hbCBKYXZhU2NyaXB0IE1hcC5cbiAqICAgICogQSBtdXRhYmxlIGFycmF5IHVzZWQgYXMgYSB2YWx1ZSwgdGhhdCBpcyBzdWJzZXF1ZW50bHkgbXV0YXRlZC5cbiAqICAgICAgRnJlZXppbmcgdGhlIGFycmF5IHdvdWxkbid0IHdvcmsgb2YgY291cnNlIGJlY2F1c2UgaXQgd291bGQgYnJlYWtcbiAqICAgICAgdGhlIHN1YnNlcXVlbnQgbXV0YXRpb24uIFVzaW5nIGEgZmFyIG9iamVjdCB3cmFwcGluZyBhbiBhcnJheSB3b3VsZFxuICogICAgICBsaWtlbHkgd29yayBmaW5lLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJNYXAgaWYgcG9zc2libGUsIE1hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5TWFwPSh0YWc9J2tleScpPT57XG5jb25zdCBtPW5ldyBNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hbS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5tLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABay5YGrQYAAK0GAAAwAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuLyoqXG4gKiBTZWUgZG9jY29tbWVudCBpbiB0aGUgY2xvc2VseSByZWxhdGVkIGBsZWdhY3lNYXAuanNgIG1vZHVsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyV2Vha01hcCBpZiBwb3NzaWJsZSwgV2Vha01hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5V2Vha01hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIXdtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbndtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gd20uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi93bS5nZXQoa2V5KSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLmRlbGV0ZShrZXkpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5V2Vha01hcChtYWtlTGVnYWN5V2Vha01hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeVdlYWtNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKD8gCrSQAAA0kAAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL2hlbHBlcnMvZXJyb3IuanMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLGFzc2VydFJlY29yZCxnZXRUYWcsbWFrZVRhZ2dlZCxFcnJvckhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvaW50ZXJuYWwnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZE5hbWVzPShyZWNvcmQpPT5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4vKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4vKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbmhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaOKAjV9vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fEZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qIEphdmFTY3JpcHQgYmlnaW50cyBhcmUgZW5jb2RlZCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuKi9cbi8qIGluaXRpYWwgY29tcG9uZW50IGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdCBjb3VudCBhcyBhIHVuYXJ5IHN0cmluZywgYSovXG4vKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGUqL1xuLyogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uKi9cbi8qIFRvIGVuc3VyZSB0aGF0IHRoZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgb2YgZW5jb2RlZCB2YWx1ZXMgbWF0Y2hlcyB0aGUqL1xuLyogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeSovXG4vKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YqL1xuLyogXCIjXCJzIFt3aGljaCBzb3J0IGJlZm9yZSBkZWNpbWFsIGRpZ2l0c10pIHZzLiBwb3NpdGl2ZSBhbmQgemVybyB2YWx1ZXMgKHR5cGUqL1xuLyogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmQqL1xuLyogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0cyovXG4vKiB0ZW4ncyBjb21wbGVtZW50IChzbyB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBvZiB0aGUgc2FtZSBzY2FsZSBzb3J0IGJ5Ki9cbi8qICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8RmFpbCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8RmFpbCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKDEpO1xucmVtLmxlbmd0aD09PW5EaWdpdHN8fFxuRmFpbCBgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gO1xuZWxlbUNoYXJzLnB1c2goYzIpO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuIH1cbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxGYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCcoJykpO1xuY29uc3Qga2V5c3ZhbHM9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xua2V5c3ZhbHMubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEAgdHMtaWdub3JlKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5lbmNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbnt9KT0+e1xuY29uc3QgZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCdyJyl8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnIScpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2UocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJz8nKXx8XG5GYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gYHkke25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfVxuICovXG4vKiBgeWFybiBsaW50YCBjb21wbGFpbnMgaGVyZSBidXQgbm90IGZvciBlcXVpdmFsZW50IGNvZGUgaW4gYWdvcmljLXNkay4qL1xuLyogQWxzbywgdnNjb2RlIGRvZXMgbm90IGNvbXBsYWluLiBIZW5jZSB3ZSdyZSB1c2luZyBhdC10cy1pZ25vcmUgcmF0aGVyIHRoYW4qL1xuLyogYXQtdHMtZXhwZWN0LWVycm9yLiBVc2luZyBhdC10cy1pZ25vcmUgc2hvdWxkIGFsc28gZ2VuZXJhdGUgYSBjb21wbGFpbnQqL1xuLyogdGhhdCB3ZSBzaG91bGQgYmUgdXNpbmcgYXQtZXhwZWN0LWVycm9yLCB3aGVyZSB3ZSB3b3VsZCBub3JtYWxseSBuZWVkKi9cbi8qIHRvIHN1cHByZXNzIHRoYXQgZXJyb3IgYXMgd2VsbC4gSG93ZXZlciwgcGVyaGFwcyB0aGF0IHNlY29uZCBlcnJvciBjdXJyZW50bHkqL1xuLyogaGFwcGVucyBvbmx5IGluIGFnb3JpYy1zZGssIGJ1dCBub3QgeWV0IGluIGVuZG8uIFRPRE8gZmlndXJlIG91dCBhbmQgZml4LiovXG4vKiBAIHRzLWlnbm9yZSovXG5jb25zdCAgICAgICAgbWFrZURlY29kZVBhc3NhYmxlPSh7XG5kZWNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5kZWNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZGVjb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG57fSk9PntcbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KDApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQpO1xuIH1cbmNhc2Uncyc6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpO1xuIH1cbmNhc2UnYic6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpIT09J2ZhbHNlJztcbiB9XG5jYXNlJ24nOlxuY2FzZSdwJzp7XG5yZXR1cm4gZGVjb2RlQmlnSW50KGVuY29kZWQpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnISc6e1xucmV0dXJuIGRlY29kZUVycm9yKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UneSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGVkLnN1YnN0cmluZygxKSk7XG4gfVxuY2FzZSdbJzp7XG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2VuY29kZWR9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFua09yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9aGFyZGVuKHtcbl9fcHJvdG9fXzpudWxsLFxuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9KTskaOKAjV9vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACRpMmBOi4AADouAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc3siaW1wb3J0cyI6WyIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmluZUhlYXBGYXJDbGFzcyIsImRlZmluZUhlYXBGYXJDbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VIZWFwRmFySW5zdGFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLEUsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLGZpdCxNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzLHNlYWwsZnJlZXplfT1PYmplY3Q7XG5cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShhcmdzLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdCBwYXJhbXNQYXR0ZXJuPU0uc3BsaXRBcnJheShcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkKTtcblxuZml0KGhhcmRlbihhcmdzKSxwYXJhbXNQYXR0ZXJuLGxhYmVsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHtNZXRob2R9XG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e3N5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuc3luY01ldGhvZCguLi5hcmdzKXtcbmRlZmVuZFN5bmNBcmdzKGhhcmRlbihhcmdzKSxtZXRob2RHdWFyZCxsYWJlbCk7XG5jb25zdCByZXN1bHQ9YXBwbHkobWV0aG9kLHRoaXMsYXJncyk7XG5maXQoaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH19O1xuXG5yZXR1cm4gc3luY01ldGhvZDtcbiB9O1xuXG5jb25zdCBpc0F3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5hcmdHdWFyZCYmdHlwZW9mIGFyZ0d1YXJkPT09J29iamVjdCcmJmFyZ0d1YXJkLmtsYXNzPT09J2F3YWl0QXJnJztcblxuY29uc3QgZGVzeW5jPShtZXRob2RHdWFyZCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcz1bXSxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpfHxcbkZhaWwgYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG5jb25zdCByYXdBcmdHdWFyZHM9Wy4uLmFyZ0d1YXJkcywuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbmNvbnN0IGF3YWl0SW5kZXhlcz1bXTtcbmZvcihsZXQgaT0wO2k8cmF3QXJnR3VhcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGFyZ0d1YXJkPXJhd0FyZ0d1YXJkc1tpXTtcbmlmKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpe1xucmF3QXJnR3VhcmRzW2ldPWFyZ0d1YXJkLmFyZ0d1YXJkO1xuYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gfVxuIH1cbnJldHVybntcbmF3YWl0SW5kZXhlcyxcbnJhd01ldGhvZEd1YXJkOntcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZH19O1xuXG5cbiB9O1xuXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7YXdhaXRJbmRleGVzLHJhd01ldGhvZEd1YXJkfT1kZXN5bmMobWV0aG9kR3VhcmQpO1xuY29uc3R7YXN5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuYXN5bmNNZXRob2QoLi4uYXJncyl7XG5jb25zdCBhd2FpdExpc3Q9YXdhaXRJbmRleGVzLm1hcCgoaSk9PmFyZ3NbaV0pO1xuY29uc3QgcD1Qcm9taXNlLmFsbChhd2FpdExpc3QpO1xuY29uc3QgcmF3QXJncz1bLi4uYXJnc107XG5jb25zdCByZXN1bHRQPUUud2hlbihwLChhd2FpdGVkQXJncyk9PntcbmZvcihsZXQgaj0wO2o8YXdhaXRJbmRleGVzLmxlbmd0aDtqKz0xKXtcbnJhd0FyZ3NbYXdhaXRJbmRleGVzW2pdXT1hd2FpdGVkQXJnc1tqXTtcbiB9XG5kZWZlbmRTeW5jQXJncyhyYXdBcmdzLHJhd01ldGhvZEd1YXJkLGxhYmVsKTtcbnJldHVybiBhcHBseShtZXRob2QsdGhpcyxyYXdBcmdzKTtcbiB9KTtcbnJldHVybiBFLndoZW4ocmVzdWx0UCwocmVzdWx0KT0+e1xuZml0KGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9KTtcbiB9fTtcblxucmV0dXJuIGFzeW5jTWV0aG9kO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtrbGFzcyxjYWxsS2luZH09bWV0aG9kR3VhcmQ7XG5hc3NlcnQoa2xhc3M9PT0nbWV0aG9kR3VhcmQnKTtcbmlmKGNhbGxLaW5kPT09J3N5bmMnKXtcbnJldHVybiBkZWZlbmRTeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfWVsc2V7XG5hc3NlcnQoY2FsbEtpbmQ9PT0nYXN5bmMnKTtcbnJldHVybiBkZWZlbmRBc3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kVGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxubWV0aG9kR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCdmdW5jdGlvbicpO1xuXG5jb25zdCBnZXRDb250ZXh0PShzZWxmKT0+e1xuY29uc3QgY29udGV4dD1jb250ZXh0TWFwLmdldChzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLGNvbnRleHQsYXJncyk7XG4gfX06XG5cbntcbm1ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxudWxsLFtjb250ZXh0LC4uLmFyZ3NdKTtcbiB9fTtcblxuaWYobWV0aG9kR3VhcmQpe1xubWV0aG9kPWRlZmVuZE1ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbWV0aG9kVGFnKTtcbiB9XG5kZWZpbmVQcm9wZXJ0aWVzKG1ldGhvZCx7XG5uYW1lOnt2YWx1ZTptZXRob2RUYWd9LFxubGVuZ3RoOntcbnZhbHVlOnRoaXNmdWxNZXRob2RzP2JlaGF2aW9yTWV0aG9kLmxlbmd0aDpiZWhhdmlvck1ldGhvZC5sZW5ndGgtMX19KTtcblxuXG5yZXR1cm4gbWV0aG9kO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtXZWFrTWFwfSBjb250ZXh0TWFwXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbaW50ZXJmYWNlR3VhcmRdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBwcm90b3R5cGU9e307XG5jb25zdCBtZXRob2ROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuLyogQnkgaWdub3JpbmcgYW55IG1ldGhvZCBuYW1lZCBcImNvbnN0cnVjdG9yXCIsIHdlIGNhbiB1c2UgYSovXG4vKiBjbGFzcy5wcm90b3R5cGUgYXMgYSBiZWhhdmlvck1ldGhvZHMuKi9cbihuYW1lKT0+bmFtZSE9PSdjb25zdHJ1Y3RvcicpO1xuXG5sZXQgbWV0aG9kR3VhcmRzO1xuaWYoaW50ZXJmYWNlR3VhcmQpe1xuY29uc3R7XG5rbGFzcyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHM6bWcsXG5zbG9wcHk9ZmFsc2V9PVxuaW50ZXJmYWNlR3VhcmQ7XG5tZXRob2RHdWFyZHM9bWc7XG5hc3NlcnQuZXF1YWwoa2xhc3MsJ0ludGVyZmFjZScpO1xuYXNzZXJ0LnR5cGVvZihpbnRlcmZhY2VOYW1lLCdzdHJpbmcnKTtcbntcbmNvbnN0IG1ldGhvZEd1YXJkTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgdW5pbXBsZW1lbnRlZD1saXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLG1ldGhvZE5hbWVzKTtcbnVuaW1wbGVtZW50ZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5pZighc2xvcHB5KXtcbmNvbnN0IHVuZ3VhcmRlZD1saXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcyxtZXRob2RHdWFyZE5hbWVzKTtcbnVuZ3VhcmRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuIH1cbiB9XG4gfVxuZm9yKGNvbnN0IHByb3Agb2YgbWV0aG9kTmFtZXMpe1xucHJvdG90eXBlW3Byb3BdPWJpbmRNZXRob2QoXG4gYEluICR7cShwcm9wKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZHNbcHJvcF0sXG50aGlzZnVsTWV0aG9kcyxcbi8qIFRPRE8gc29tZSB0b29sIGRvZXMgbm90IHlldCB1bmRlcnN0YW5kIHRoZSBgPy5bYCBzeW50YXgqL1xubWV0aG9kR3VhcmRzJiZtZXRob2RHdWFyZHNbcHJvcF0pO1xuXG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5yZXR1cm4gRmFyKHRhZyxwcm90b3R5cGUpO1xuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2ZhckNsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIFtUID0gYW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQ29udGV4dFxuICogQHByb3BlcnR5IHtTfSBzdGF0ZVxuICogQHByb3BlcnR5IHtUfSBzZWxmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi8kaOKAjV9vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7V2Vha01hcDxULENvbnRleHQ8UywgVD4+fSAqL1xuY29uc3QgY29udGV4dE1hcD1uZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvdG90eXBlPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbmNvbnRleHRNYXAsXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxuY29uc3QgbWFrZUluc3RhbmNlPSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qKiBAdHlwZSB7VH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xuY29uc3Qgc2VsZj1oYXJkZW4oe19fcHJvdG9fXzpwcm90b3R5cGV9KTtcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q29udGV4dDxTLFQ+fSAqL1xuY29uc3QgY29udGV4dD1mcmVlemUoe3N0YXRlLHNlbGZ9KTtcbmNvbnRleHRNYXAuc2V0KHNlbGYsY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gc2VsZjtcbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzcyhkZWZpbmVIZWFwRmFyQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBGIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge0YgJiBUaGlzVHlwZTx7IGZhY2V0czogRiwgc3RhdGU6IFMgfT4gfSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IGZhY2V0TmFtZXM9b3duS2V5cyhtZXRob2RzS2l0KTtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcblxuY29uc3QgY29udGV4dE1hcEtpdD1vYmplY3RNYXAobWV0aG9kc0tpdCwoKT0+bmV3IFdlYWtNYXAoKSk7XG5jb25zdCBwcm90b3R5cGVLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKG1ldGhvZHMsZmFjZXROYW1lKT0+XG5kZWZlbmRQcm90b3R5cGUoXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGNvdWxkIGJlIHN5bWJvbCovXG4gYCR7dGFnfSAke2ZhY2V0TmFtZX1gLFxuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLFxubWV0aG9kcyxcbnRydWUsXG5pbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdKSk7XG5cblxuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuY29uc3QgY29udGV4dD17c3RhdGV9O1xuY29uc3QgZmFjZXRzPW9iamVjdE1hcChwcm90b3R5cGVLaXQsKHByb3RvdHlwZSxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gZmFjZXRzO1xuIH07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIHh4eCovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzc0tpdChkZWZpbmVIZWFwRmFyQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2Q+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGVhcEZhckluc3RhbmNlPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lSGVhcEZhckNsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUhlYXBGYXJJbnN0YW5jZShtYWtlSGVhcEZhckluc3RhbmNlKTtcbmhhcmRlbihtYWtlSGVhcEZhckluc3RhbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lSGVhcEZhckNsYXNzIjpbImRlZmluZUhlYXBGYXJDbGFzcyJdLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiOlsiZGVmaW5lSGVhcEZhckNsYXNzS2l0Il0sIm1ha2VIZWFwRmFySW5zdGFuY2UiOlsibWFrZUhlYXBGYXJJbnN0YW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACidUd8tQcAALUHAAAzAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIGNvbW1lbnRlZCBvdXQgdHlwZSBzaG91bGQgYmUgaW4gdGhpcyBmaWxlLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgdGhlcmUqL1xuLyogYW5kIGluIGV4cG9ydHMuanMqL1xuXG4vKiAvKioqL1xuLyogKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlciovXG4vKiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzKi9cbi8qICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnMqL1xuLyogKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuKi9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkKi9cbi8qICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nKi9cbi8qICogbWF0Y2hUYWcuIElzIHRoaXMgYSB2YWxpZCBwYXlsb2FkIGZvciBhIE1hdGNoZXIgd2l0aCB0aGF0IHRhZz8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBtYXRjaGVyUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlcyovXG4vKiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0cyovXG4vKiAqIHBheWxvYWQsIGRvZXMgdGhpcyBzcGVjaW1lbiBtYXRjaCB0aGF0IE1hdGNoZXI/Ki9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhwYXlsb2FkOiBQYXNzYWJsZSkgPT4gUmFua0NvdmVyfSBnZXRSYW5rQ292ZXIqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gUmV0dXJuIGEgUmFua0NvdmVyIHRvIGJvdW5kIGZyb20gYmVsb3cgYW5kIGFib3ZlLCovXG4vKiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuKi9cbi8qICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZSovXG4vKiAqIG1hdGNoaW5nIHNwZWNpbWVuLiBUaGUgcmlnaHQgZWxlbWVudCBtdXN0IGJlIGFmdGVyIG9yIHRoZSBzYW1lKi9cbi8qICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uKi9cbi8qICpYLyovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANfSaWXzyAAA88gAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vcmFua09yZGVyLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXlQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiIsImNoZWNrTWF0Y2hlcyIsImRlZmF1bHRMaW1pdHMiLCJmaXQiLCJnZXRSYW5rQ292ZXIiLCJpc0tleVBhdHRlcm4iLCJpc1BhdHRlcm4iLCJtYXRjaGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGhhc093blByb3BlcnR5T2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2UsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGlzU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWc7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhcHBseUxhYmVsaW5nRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRo4oCNX2EpXV0sW1wiZnJvbVVuaXF1ZUVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjigI1fYSldXSxbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRo4oCNX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjigI1fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wia2V5R1RcIiwgWyRo4oCNX2EgPT4gKGtleUdUID0gJGjigI1fYSldXSxbXCJrZXlHVEVcIiwgWyRo4oCNX2EgPT4gKGtleUdURSA9ICRo4oCNX2EpXV0sW1wia2V5TFRcIiwgWyRo4oCNX2EgPT4gKGtleUxUID0gJGjigI1fYSldXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2EgPT4gKGtleUxURSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrS2V5ID0gJGjigI1fYSldXSxbXCJpc0tleVwiLCBbJGjigI1fYSA9PiAoaXNLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChjaGVja1NjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wiaXNTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGlzU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlNYXAgPSAkaOKAjV9hKV1dLFtcImNvcHlNYXBLZXlTZXRcIiwgWyRo4oCNX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyx2YWx1ZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSBXZWFrU2V0PFBhdHRlcm4+ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdD0oc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKT0+e1xuaWYoXG5NYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSsxPD1cbmRlY2ltYWxEaWdpdHNMaW1pdClcbntcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgKTtcblxuIH07XG5cbi8qKlxuICogQHJldHVybnMge1BhdHRlcm5LaXR9XG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0PSgpPT57XG4vKipcbiAqIElmIHRoaXMgaXMgYSByZWNvZ25pemVkIG1hdGNoIHRhZywgcmV0dXJuIHRoZSBNYXRjaEhlbHBlci5cbiAqIE90aGVyd2lzZSByZXN1bHQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtNYXRjaEhlbHBlcj19XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGlzS2V5UGF0dGVybiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7Q2hlY2tLZXlQYXR0ZXJufSAqL1xuY29uc3QgY2hlY2tLZXlQYXR0ZXJuPShwYXR0LGNoZWNrKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogSW4gcHJpbmNpcGxlLCBhbGwga2V5cyBhcmUgcGF0dGVybnMsIGJ1dCBvbmx5IHNjYWxhcnMgYXJlIGN1cnJlbnRseSovXG4vKiBzdXBwb3J0ZWQgYXMga2V5cy4qL1xucmV0dXJuIGNoZWNrKGlzU2NhbGFyS2V5KHBhdHQpLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrS2V5UGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2V5UGF0dGVybkludGVybmFsPShwYXR0LGNoZWNrKT0+e1xuLyogUHVycG9zZWx5IHBhcmFsbGVscyBjaGVja0tleS4gVE9ETyByZXVzZSBtb3JlIGxvZ2ljIGJldHdlZW4gdGhlbS4qL1xuLyogTW9zdCBvZiB0aGUgdGV4dCBvZiB0aGUgc3dpdGNoIGJlbG93IG5vdCBkZWFsaW5nIHdpdGggbWF0Y2hlcnMgaXMqL1xuLyogZXNzZW50aWFsbHkgaWRlbnRpY2FsLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGF0dCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyhwYXR0KTtcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbmlmKG1hdGNoSGVscGVyIT09dW5kZWZpbmVkKXtcbi8qIFRoaXMgY2hlY2sgZ3VhcmFudGVlcyB0aGUgcGF5bG9hZCBpbnZhcmlhbnRzIGFzc3VtZWQgYnkgdGhlIG90aGVyKi9cbi8qIG1hdGNoSGVscGVyIG1ldGhvZHMuKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0tleVBhdHRlcm4ocGF0dC5wYXlsb2FkLGNoZWNrKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBub24tc2NhbGFyIGtleXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24tcGF0dGVybnMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtwYXR0fWA7XG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzS2V5UGF0dGVybj0ocGF0dCk9PmNoZWNrS2V5UGF0dGVybihwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKi9cbmNvbnN0IGFzc2VydEtleVBhdHRlcm49KHBhdHQpPT57XG5jaGVja0tleVBhdHRlcm4ocGF0dCxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBtYXRjaGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTWF0Y2hlcz0oc3BlY2ltZW4scGF0dGVybixjaGVjayxsYWJlbD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5hcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsW3NwZWNpbWVuLHBhdHRlcm4sY2hlY2tdLGxhYmVsKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWw9KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG4vKiBXb3J0aCBiZWluZyBhIGJpdCB2ZXJib3NlIGFuZCByZXBldGl0aXZlIGluIG9yZGVyIHRvIG9wdGltaXplKi9cbmNvbnN0IHBhdHRlcm5LaW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbmNvbnN0IHNwZWNpbWVuS2luZD1raW5kT2Yoc3BlY2ltZW4pOy8qIG1heSBiZSB1bmRlZmluZWQqL1xuc3dpdGNoKHBhdHRlcm5LaW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBGYWlsIGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBGYWlsIGBwcm9taXNlcyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiBGYWlsIGBlcnJvcnMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzpcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlCYWcnOlxuY2FzZSdyZW1vdGFibGUnOntcbi8qIFRoZXNlIGtpbmRzIGFyZSBuZWNlc3NhcmlseSBrZXlzKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7bGVuZ3RofT1wYXR0O1xuaWYoc3BlY2ltZW4ubGVuZ3RoIT09bGVuZ3RoKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbnJldHVybiBwYXR0LmV2ZXJ5KChwLGkpPT5jaGVja01hdGNoZXMoc3BlY2ltZW5baV0scCxjaGVjayxpKSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG4vKiBUT0RPIERldGVjdCBhbmQgYWNjdW11bGF0ZSBkaWZmZXJlbmNlIGluIG9uZSBwYXNzLiovXG4vKiBSYXRoZXIgdGhhbiB1c2luZyB0d28gY2FsbHMgdG8gYGxpc3REaWZmZXJlbmNlYCB0byBkZXRlY3QgYW5kKi9cbi8qIHJlcG9ydCBpZiBhbmQgaG93IHRoZXNlIGxpc3RzIGRpZmZlciwgc2luY2UgdGhleSBhcmUgYWxyZWFkeSovXG4vKiBpbiBzb3J0ZWQgb3JkZXIsIHdlIHNob3VsZCBpbnN0ZWFkIHVzZSBhbiBhbGdvcml0aG0gbGlrZSovXG4vKiBgaXRlckRpc2pvaW50VW5pb25gIGZyb20gbWVyZ2Utc29ydC1vcGVyYXRvcnMuanMqL1xuY29uc3Qgc3BlY2ltZW5OYW1lcz1yZWNvcmROYW1lcyhzcGVjaW1lbik7XG5jb25zdCBwYXR0TmFtZXM9cmVjb3JkTmFtZXMocGF0dCk7XG5jb25zdCBtaXNzaW5nPWxpc3REaWZmZXJlbmNlKHBhdHROYW1lcyxzcGVjaW1lbk5hbWVzKTtcbmlmKG1pc3NpbmcubGVuZ3RoPj0xKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGhhdmUgbWlzc2luZyBwcm9wZXJ0aWVzICR7cShtaXNzaW5nKX1gKTtcblxuIH1cbmNvbnN0IHVuZXhwZWN0ZWQ9bGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcyxwYXR0TmFtZXMpO1xuaWYodW5leHBlY3RlZC5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG51bmV4cGVjdGVkKVxuIH1gKTtcblxuIH1cbmNvbnN0IHNwZWNpbWVuVmFsdWVzPXJlY29yZFZhbHVlcyhzcGVjaW1lbixzcGVjaW1lbk5hbWVzKTtcbmNvbnN0IHBhdHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHBhdHQscGF0dE5hbWVzKTtcbnJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSxwYXR0VmFsdWVzW2ldLGNoZWNrLGxhYmVsKSk7XG5cbiB9XG5jYXNlJ2NvcHlNYXAnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5TWFwJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlNYXAgdG8gbWF0Y2ggYSBjb3B5TWFwIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbmNvbnN0e3BheWxvYWQ6cGF0dFBheWxvYWR9PXBhdHQ7XG5jb25zdHtwYXlsb2FkOnNwZWNpbWVuUGF5bG9hZH09c3BlY2ltZW47XG5jb25zdCBwYXR0S2V5U2V0PWNvcHlNYXBLZXlTZXQocGF0dFBheWxvYWQpO1xuY29uc3Qgc3BlY2ltZW5LZXlTZXQ9Y29weU1hcEtleVNldChzcGVjaW1lblBheWxvYWQpO1xuLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbmlmKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQscGF0dEtleVNldCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHBhdHRWYWx1ZXM9cGF0dFBheWxvYWQudmFsdWVzO1xuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9c3BlY2ltZW5QYXlsb2FkLnZhbHVlcztcbi8qIGNvbXBhcmUgdmFsdWVzIGFzIGNvcHlBcnJheXMqL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlcyxwYXR0VmFsdWVzLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuaWYobWF0Y2hIZWxwZXIpe1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IG1hdGNoZXM9KHNwZWNpbWVuLHBhdHQpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogUmV0dXJuaW5nIG5vcm1hbGx5IGluZGljYXRlcyBzdWNjZXNzLiBNYXRjaCBmYWlsdXJlIGlzIGluZGljYXRlZCBieVxuICogdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKi9cbmNvbnN0IGZpdD0oc3BlY2ltZW4scGF0dCxsYWJlbD11bmRlZmluZWQpPT57XG5pZihjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIsbGFiZWwpKXtcbnJldHVybjtcbiB9XG4vKiBzaG91bGQgb25seSB0aHJvdyovXG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxhc3NlcnRDaGVja2VyLGxhYmVsKTtcbkZhaWwgYGludGVybmFsOiAke2xhYmVsfTogaW5jb25zaXN0ZW50IHBhdHRlcm4gbWF0Y2g6ICR7cShwYXR0KX1gO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGdldFJhbmtDb3ZlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7R2V0UmFua0NvdmVyfSAqL1xuY29uc3QgZ2V0UmFua0NvdmVyPShwYXR0LGVuY29kZVBhc3NhYmxlKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQYXNzYWJsZShwYXR0KTtcbmlmKGVuY29kZWQhPT11bmRlZmluZWQpe1xucmV0dXJuW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuIH1cbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGF0dCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weUFycmF5Jzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlBcnJheXMuKi9cbi8qKi9cbi8qIGNvbnN0IHJhbmtDb3ZlcnMgPSBwYXR0Lm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogcmFua0NvdmVycy5tYXAoKFtsZWZ0LCBfcmlnaHRdKSA9PiBsZWZ0KSwqL1xuLyogcmFua0NvdmVycy5tYXAoKFtfbGVmdCwgcmlnaHRdKSA9PiByaWdodCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVJlY29yZHMuKi9cbi8qKi9cbi8qIGNvbnN0IHBhdHRLZXlzID0gb3duS2V5cyhwYXR0KTsqL1xuLyogY29uc3QgcGF0dEVudHJpZXMgPSBoYXJkZW4ocGF0dEtleXMubWFwKGtleSA9PiBba2V5LCBwYXR0W2tleV1dKSk7Ki9cbi8qIGNvbnN0IFtsZWZ0RW50cmllc0xpbWl0LCByaWdodEVudHJpZXNMaW1pdF0gPSovXG4vKiBnZXRSYW5rQ292ZXIocGF0dEVudHJpZXMpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMobGVmdEVudHJpZXNMaW1pdCksKi9cbi8qIGZyb21VbmlxdWVFbnRyaWVzKHJpZ2h0RW50cmllc0xpbWl0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVNldHMuKi9cbi8qKi9cbi8qIC8vIFNob3VsZCBhbHJlYWR5IGJlIHZhbGlkYXRlZCBieSBjaGVja1BhdHRlcm4uIEJ1dCBiZWNhdXNlIHRoaXMqL1xuLyogLy8gaXMgYSBjaGVjayB0aGF0IG1heSBsb29zZW4gb3ZlciB0aW1lLCB3ZSBhbHNvIGFzc2VydCovXG4vKiAvLyBldmVyeXdoZXJlIHdlIHN0aWxsIHJlbHkgb24gdGhlIHJlc3RyaWN0aW9uLiovXG4vKiBgYGBqcyovXG4vKiBwYXR0LnBheWxvYWQubGVuZ3RoID09PSAxIHx8Ki9cbi8qIEZhaWxgTm9uLXNpbmdsZXRvbiBjb3B5U2V0cyB3aXRoIG1hdGNoZXIgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXR0fWA7Ki9cbi8qIGBgYCovXG4vKiovXG4vKiBjb25zdCBbbGVmdEVsZW1lbnRMaW1pdCwgcmlnaHRFbGVtZW50TGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWRbMF0sKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlQ29weVNldChbbGVmdEVsZW1lbnRMaW1pdF0pLCovXG4vKiBtYWtlQ29weVNldChbcmlnaHRFbGVtZW50TGltaXRdKSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5TWFwcy4qL1xuLyoqL1xuLyogLy8gQSBtYXRjaGluZyBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLCBvciBhdCBtb3N0IG9uZSovXG4vKiAvLyBub24ta2V5IGtleSBwYXR0ZXJuLiBUaHVzIHdlIGNhbiBhc3N1bWUgdGhhdCB2YWx1ZSBwb3NpdGlvbnMqL1xuLyogLy8gbWF0Y2ggMS10by0xLiovXG4vKiAvLyovXG4vKiAvLyBUT0RPIEkgbWF5IGJlIG92ZXJsb29raW5nIHRoYXQgdGhlIGxlc3MgcHJlY2lzZSByYW5rT3JkZXIqL1xuLyogLy8gZXF1aXZhbGVuY2UgY2xhc3MgbWF5IGNhdXNlIHZhbHVlcyB0byBiZSBvdXQgb2Ygb3JkZXIsKi9cbi8qIC8vIG1ha2luZyB0aGlzIHJhbmtDb3ZlciBub3QgYWN0dWFsbHkgY292ZXIuIEluIHRoYXQgY2FzZSwgZm9yKi9cbi8qIC8vIGFsbCB0aGUgdmFsdWVzIGZvciBrZXlzIGF0IHRoZSBzYW1lIHJhbmssIHdlIHNob3VsZCB1bmlvbiB0aGVpciovXG4vKiAvLyByYW5rIGNvdmVycy4gVE9ETyBQT1NTSUJMRSBTSUxFTlQgQ09SUkVDVE5FU1MgQlVHKi9cbi8qIC8vKi9cbi8qIC8vIElmIHRoaXMgaXMgYSBidWcsIGl0IHByb2JhYmx5IGFmZmVjdHMgdGhlIGdldFJhbmtDb3ZlciovXG4vKiAvLyBjYXNlcyBvZiBtYXRjaExURUhlbHBlciBhbmQgbWF0Y2hHVEVIZWxwZXIgb24gY29weU1hcCBhcyovXG4vKiAvLyB3ZWxsLiBTZWUgbWFrZUNvcHlNYXAgZm9yIGFuIGlkZWEgb24gZml4aW5nKi9cbi8qIC8vIHRoaXMgYnVnLiovXG4vKiBjb25zdCBbbGVmdFBheWxvYWRMaW1pdCwgcmlnaHRQYXlsb2FkTGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWQsKi9cbi8qIGVuY29kZVBhc3NhYmxlLCovXG4vKiApOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIGxlZnRQYXlsb2FkTGltaXQpLCovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgcmlnaHRQYXlsb2FkTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuIH07XG5cbmNvbnN0IGFycmF5RXZlcnlNYXRjaFBhdHRlcm49KGFycmF5LHBhdHQsY2hlY2ssbGFiZWxQcmVmaXg9JycpPT57XG5pZihjaGVja0tpbmQocGF0dCwnbWF0Y2g6YW55JyxpZGVudENoZWNrZXIpKXtcbi8qIGlmIHRoZSBwYXR0ZXJuIGlzIE0uYW55KCksIHdlIGtub3cgaXRzIHRydWUqL1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGFycmF5LmV2ZXJ5KChlbCxpKT0+XG5jaGVja01hdGNoZXMoZWwscGF0dCxjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW55SGVscGVyPUZhcignbWF0Y2g6YW55IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihfc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWUsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihtYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxubWF0Y2hlclBheWxvYWQ9PT11bmRlZmluZWR8fFxuY2hlY2soZmFsc2UsWCBgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW5kSGVscGVyPUZhcignbWF0Y2g6YW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGNoZWNrKSk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRQYXR0cyxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxjaGVjayk7XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHthbGxlZ2VkUGF0dHN9YCkpJiZcbmFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KSk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG5pbnRlcnNlY3RSYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKSxcblxuXG5jaGVja0tleVBhdHRlcm46KHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsY2hlY2spKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoT3JIZWxwZXI9RmFyKCdtYXRjaDpvciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5jb25zdHtsZW5ndGh9PXBhdHRzO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cGF0dHN9YCk7XG5cbiB9XG5pZihcbnBhdHRzLmxlbmd0aD09PTImJlxuIW1hdGNoZXMoc3BlY2ltZW4scGF0dHNbMF0pJiZcbmNoZWNrS2luZChwYXR0c1swXSwnbWF0Y2g6a2luZCcsaWRlbnRDaGVja2VyKSYmXG5wYXR0c1swXS5wYXlsb2FkPT09J3VuZGVmaW5lZCcpXG57XG4vKiBXb3J0aCBzcGVjaWFsIGNhc2luZyB0aGUgb3B0aW9uYWwgcGF0dGVybiBmb3IqL1xuLyogYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHRzWzFdLGNoZWNrKTtcbiB9XG5pZihwYXR0cy5zb21lKChwYXR0KT0+bWF0Y2hlcyhzcGVjaW1lbixwYXR0KSkpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtwYXR0c31gKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihwYXR0cyxlbmNvZGVQYXNzYWJsZSk9PlxudW5pb25SYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKSxcblxuXG5jaGVja0tleVBhdHRlcm46KHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsY2hlY2spKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTm90SGVscGVyPUZhcignbWF0Y2g6bm90IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0LGNoZWNrKT0+e1xuaWYobWF0Y2hlcyhzcGVjaW1lbixwYXR0KSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfWVsc2V7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tQYXR0ZXJuLFxuXG5nZXRSYW5rQ292ZXI6KF9wYXR0LF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddLFxuXG5jaGVja0tleVBhdHRlcm59KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihraW5kLGNoZWNrKT0+e1xuc3dpdGNoKGtpbmQpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzpcbmNhc2UncmVtb3RhYmxlJzpcbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke2tpbmR9IGtleXMgYXJlIG5vdCBzdXBwb3J0ZWRgKTtcbiB9fVxuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soc3BlY2ltZW4+PTBuLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdzdHJpbmcnLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1zdHJpbmdMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzdHJpbmcgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN5bWJvbEhlbHBlcj1GYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3ltYm9sTmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnc3ltYm9sJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHN5bWJvbE5hbWU9bmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuaWYodHlwZW9mIHN5bWJvbE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuIH1cbnJldHVybiBjaGVjayhcbnN5bWJvbE5hbWUubGVuZ3RoPD1zeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG5YIGBTeW1ib2wgbmFtZSAke3EoXG5zeW1ib2xOYW1lKVxuIH0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyPUZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyZW1vdGFibGVEZXNjLGNoZWNrKT0+e1xuLyogVW5mb3J0dW5hdGUgZHVwbGljYXRpb24gb2YgY2hlY2tLaW5kIGxvZ2ljLCBidXQgbm8gYmV0dGVyIGNob2ljZXMuKi9cbmlmKGNoZWNrS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJyxpZGVudENoZWNrZXIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgc3BlY2ltZW5LaW5kPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHNwZWNpbWVuS2luZD09PSd0YWdnZWQnKXtcbnNwZWNpbWVuS2luZD1nZXRUYWcoc3BlY2ltZW4pO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuXG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChcblsgYCR7c3BlY2ltZW5LaW5kfSBgLGAgLSBNdXN0IGJlIGEgcmVtb3RhYmxlICgke2xhYmVsfSlgXSxcbnNwZWNpbWVuKTtcblxucmV0dXJuIGNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX3JlbW90YWJsZURlc2MsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaExURUhlbHBlcj1GYXIoJ21hdGNoOmx0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPD0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbi8qIHRvIGJlIGBsZXRgKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3UmlnaHRCb3VuZD0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbmlmKG5ld1JpZ2h0Qm91bmQhPT11bmRlZmluZWQpe1xucmlnaHRCb3VuZD1uZXdSaWdodEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRIZWxwZXI9RmFyKCdtYXRjaDpsdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3ZlcixcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RIZWxwZXI9RmFyKCdtYXRjaDpndCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3ZlcixcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXI9RmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1Qcm9wZXJ0aWVzTGltaXQscHJvcGVydHlOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSYmXG5jaGVjayhcbm93bktleXMoc3BlY2ltZW4pLmxlbmd0aDw9bnVtUHJvcGVydGllc0xpbWl0LFxuWCBgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtUHJvcGVydGllc0xpbWl0KVxuIH0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gKSYmXG5cbmVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVjayxcbltcbmtleS5sZW5ndGg8PXByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuWCBgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdClcbiB9YF0sXG5cbmtleSkmJlxuXG5jaGVja01hdGNoZXMoXG5oYXJkZW4oW2tleSx2YWx1ZV0pLFxuaGFyZGVuKFtrZXlQYXR0LHZhbHVlUGF0dF0pLFxuY2hlY2ssXG5rZXkpKSk7XG5cblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX2VudHJ5UGF0dCxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgUmVjb3JkcyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyPUZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3N1YlBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHthcnJheUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1hcnJheUxlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWApKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sc3ViUGF0dCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDphcnJheU9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfLGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBBcnJheXMgbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfLGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBDb3B5U2V0cyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hCYWdPZkhlbHBlcj1GYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsY291bnRQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QmFnJyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcblggYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0KVxuIH0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWApJiZcblxuc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbihba2V5LGNvdW50XSxpKT0+XG5jaGVja01hdGNoZXMoa2V5LGtleVBhdHQsY2hlY2ssIGBiYWcga2V5c1ske2l9XWApJiZcbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuW2NvdW50LGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVja10sXG4gYGJhZyBjb3VudHNbJHtpfV1gKSYmXG5cbmNoZWNrTWF0Y2hlcyhjb3VudCxjb3VudFBhdHQsY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YmFnT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYENvcHlCYWdzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE1hcE9mSGVscGVyPUZhcignbWF0Y2g6bWFwT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtTWFwRW50cmllc0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5TWFwJyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1udW1NYXBFbnRyaWVzTGltaXQsXG5YIGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxubnVtTWFwRW50cmllc0xpbWl0KVxuIH0gZW50cmllczogJHtzcGVjaW1lbn1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMsXG5rZXlQYXR0LFxuY2hlY2ssXG4nbWFwIGtleXMnKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbnZhbHVlUGF0dCxcbmNoZWNrLFxuJ21hcCB2YWx1ZXMnKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOm1hcE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX2VudHJ5UGF0dCxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgQ29weU1hcCBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRBcnJheVBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuY29uc3QgbnVtUmVxdWlyZWQ9cmVxdWlyZWRQYXR0Lmxlbmd0aDtcbmNvbnN0IG51bU9wdGlvbmFsPW9wdGlvbmFsUGF0dC5sZW5ndGg7XG5jb25zdCByZXF1aXJlZFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKDAsbnVtUmVxdWlyZWQpO1xuY29uc3Qgb3B0aW9uYWxTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShcbm51bVJlcXVpcmVkLFxubnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xuXG5jb25zdCByZXN0U3BlY2ltZW49c3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xucmV0dXJuIGhhcmRlbih7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn0pO1xuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gZWxlbWVudHMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7UGF0dGVybltdfSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRBcnJheVBhdHRlcm49KG9wdGlvbmFsUGF0dCxsZW5ndGgpPT5cbmhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCxsZW5ndGgpLm1hcCgocGF0dCk9Pk1NLm9wdChwYXR0KSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyPUZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PVtdLHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdEFycmF5UGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdEFycmF5UGF0dGVybihcbm9wdGlvbmFsUGF0dCxcbm9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoKTtcblxubGV0IGFyZ051bT0wO1xucmV0dXJuKFxuKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoPT09cmVxdWlyZWRQYXR0Lmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxucmVxdWlyZWRQYXR0Lmxlbmd0aClcbiB9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gKSkmJlxuXG5yZXF1aXJlZFBhdHQuZXZlcnkoKHAsaSk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSkmJlxuXG5wYXJ0aWFsUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSkmJlxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuXG5jaGVja0tleVBhdHRlcm46KFxuW19yZXF1aXJlZFBhdHQsX29wdGlvbmFsUGF0dD11bmRlZmluZWQsX3Jlc3RQYXR0PXVuZGVmaW5lZF0sXG5jaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgY29weVJlY29yZCBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXNzYWJsZT59IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgcmVzdFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPlxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cz0oc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk9Pntcbi8qIE5vdCBmcm96ZW4hIE11dGF0ZWQgaW4gcGxhY2UqL1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlcXVpcmVkRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCBvcHRpb25hbEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVzdEVudHJpZXM9W107XG5mb3IoY29uc3RbbmFtZSx2YWx1ZV1vZiBlbnRyaWVzKHNwZWNpbWVuKSl7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHJlcXVpcmVkUGF0dCxuYW1lKSl7XG5yZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNlIGlmKGhhc093blByb3BlcnR5T2Yob3B0aW9uYWxQYXR0LG5hbWUpKXtcbm9wdGlvbmFsRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2V7XG5yZXN0RW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe1xucmVxdWlyZWRTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXF1aXJlZEVudHJpZXMpLFxub3B0aW9uYWxTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxucmVzdFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlc3RFbnRyaWVzKX0pO1xuXG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiB2YWx1ZXMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuPShvcHRpb25hbFBhdHQsbmFtZXMpPT5cbmZyb21VbmlxdWVFbnRyaWVzKG5hbWVzLm1hcCgobmFtZSk9PltuYW1lLE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdFJlY29yZEhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9e30scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdFJlY29yZFBhcnRzKHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpO1xuXG5jb25zdCBwYXJ0aWFsTmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKG9wdGlvbmFsU3BlY2ltZW4pO1xuY29uc3QgcGFydGlhbFBhdHQ9YWRhcHRSZWNvcmRQYXR0ZXJuKG9wdGlvbmFsUGF0dCxwYXJ0aWFsTmFtZXMpO1xucmV0dXJuKFxuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4scmVxdWlyZWRQYXR0LGNoZWNrKSYmXG5wYXJ0aWFsTmFtZXMuZXZlcnkoKG5hbWUpPT5cbmNoZWNrTWF0Y2hlcyhcbm9wdGlvbmFsU3BlY2ltZW5bbmFtZV0sXG5wYXJ0aWFsUGF0dFtuYW1lXSxcbmNoZWNrLFxuIGAke25hbWV9P2ApKSYmXG5cblxuY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbixyZXN0UGF0dCxjaGVjaywnLi4ucmVzdCcpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weVJlY29yZCcmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlSZWNvcmQnKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbnJlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpLFxuXG5jaGVja0tleVBhdHRlcm46KFxuW19yZXF1aXJlZFBhdHQsX29wdGlvbmFsUGF0dD11bmRlZmluZWQsX3Jlc3RQYXR0PXVuZGVmaW5lZF0sXG5jaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgY29weVJlY29yZCBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbmlmKG9wdGlvbmFsKXtcbnJldHVybltiYXNlLG9wdGlvbmFsLHJlc3RdO1xuIH1cbnJldHVybltiYXNlLGVtcHR5LHJlc3RdO1xuIH1cbmlmKG9wdGlvbmFsKXtcbnJldHVybltiYXNlLG9wdGlvbmFsXTtcbiB9XG5yZXR1cm5bYmFzZV07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0geydzeW5jJ3wnYXN5bmMnfSBjYWxsS2luZFxuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBhcmdHdWFyZHNcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gW29wdGlvbmFsQXJnR3VhcmRzXVxuICogQHBhcmFtIHtBcmdHdWFyZH0gW3Jlc3RBcmdHdWFyZF1cbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZE1ha2VyfVxuICovXG5jb25zdCBtYWtlTWV0aG9kR3VhcmRNYWtlcj0oXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPXVuZGVmaW5lZCxcbnJlc3RBcmdHdWFyZD11bmRlZmluZWQpPT5cblxuaGFyZGVuKHtcbm9wdGlvbmFsOiguLi5vcHRBcmdHdWFyZHMpPT57XG5vcHRpb25hbEFyZ0d1YXJkcz09PXVuZGVmaW5lZHx8XG5GYWlsIGBDYW4gb25seSBoYXZlIG9uZSBzZXQgb2Ygb3B0aW9uYWwgZ3VhcmRzYDtcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8XG5GYWlsIGBvcHRpb25hbCBhcmcgZ3VhcmRzIG11c3QgY29tZSBiZWZvcmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKGNhbGxLaW5kLGFyZ0d1YXJkcyxvcHRBcmdHdWFyZHMpO1xuIH0sXG5yZXN0OihyQXJnR3VhcmQpPT57XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fEZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yQXJnR3VhcmQpO1xuXG4gfSxcbnJldHVybnM6KHJldHVybkd1YXJkPVVuZGVmaW5lZFNoYXBlKT0+XG5oYXJkZW4oe1xua2xhc3M6J21ldGhvZEd1YXJkJyxcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQsXG5yZXR1cm5HdWFyZH0pfSk7XG5cblxuXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmhhcmRlbih7XG5rbGFzczonYXdhaXRBcmcnLFxuYXJnR3VhcmR9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoZXJOYW1lc3BhY2V9ICovXG5jb25zdCBNPWhhcmRlbih7XG5hbnk6KCk9PkFueVNoYXBlLFxuYW5kOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLHBhdHRzKSxcbm9yOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpvcicscGF0dHMpLFxubm90OihzdWJQYXR0KT0+bWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsc3ViUGF0dCksXG5cbnNjYWxhcjooKT0+U2NhbGFyU2hhcGUsXG5rZXk6KCk9PktleVNoYXBlLFxucGF0dGVybjooKT0+UGF0dGVyblNoYXBlLFxua2luZDptYWtlS2luZE1hdGNoZXIsXG5ib29sZWFuOigpPT5Cb29sZWFuU2hhcGUsXG5udW1iZXI6KCk9Pk51bWJlclNoYXBlLFxuYmlnaW50OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsW2xpbWl0c10pOkJpZ0ludFNoYXBlLFxubmF0OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsW2xpbWl0c10pOk5hdFNoYXBlLFxuc3RyaW5nOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsW2xpbWl0c10pOlN0cmluZ1NoYXBlLFxuc3ltYm9sOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsW2xpbWl0c10pOlN5bWJvbFNoYXBlLFxucmVjb3JkOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5yZWNvcmRPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpSZWNvcmRTaGFwZSxcbmFycmF5OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5hcnJheU9mKE0uYW55KCksbGltaXRzKTpBcnJheVNoYXBlLFxuc2V0OihsaW1pdHM9dW5kZWZpbmVkKT0+bGltaXRzP00uc2V0T2YoTS5hbnkoKSxsaW1pdHMpOlNldFNoYXBlLFxuYmFnOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5iYWdPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpCYWdTaGFwZSxcbm1hcDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ubWFwT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6TWFwU2hhcGUsXG5yZW1vdGFibGU6bWFrZVJlbW90YWJsZU1hdGNoZXIsXG5lcnJvcjooKT0+RXJyb3JTaGFwZSxcbnByb21pc2U6KCk9PlByb21pc2VTaGFwZSxcbnVuZGVmaW5lZDooKT0+VW5kZWZpbmVkU2hhcGUsXG5udWxsOigpPT5udWxsLFxuXG5sdDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0JyxyaWdodE9wZXJhbmQpLFxubHRlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHRlJyxyaWdodE9wZXJhbmQpLFxuZXE6KGtleSk9PntcbmFzc2VydEtleShrZXkpO1xucmV0dXJuIGtleT09PXVuZGVmaW5lZD9NLnVuZGVmaW5lZCgpOmtleTtcbiB9LFxubmVxOihrZXkpPT5NLm5vdChNLmVxKGtleSkpLFxuZ3RlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3RlJyxyaWdodE9wZXJhbmQpLFxuZ3Q6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndCcscmlnaHRPcGVyYW5kKSxcblxucmVjb3JkT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6cmVjb3JkT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbmFycmF5T2Y6KHN1YlBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsW3N1YlBhdHQsbGltaXRzXSksXG5zZXRPZjooa2V5UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzZXRPZicsW2tleVBhdHQsbGltaXRzXSksXG5iYWdPZjooa2V5UGF0dD1NLmFueSgpLGNvdW50UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsW2tleVBhdHQsY291bnRQYXR0LGxpbWl0c10pLFxubWFwT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbnNwbGl0QXJyYXk6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdEFycmF5Jyxcbm1ha2VTcGxpdFBheWxvYWQoW10sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0UmVjb3JkOihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRSZWNvcmQnLFxubWFrZVNwbGl0UGF5bG9hZCh7fSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXQ6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UscmVzdCYmW10scmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZChiYXNlLHJlc3QmJnt9LHJlc3QpO1xuIH1cbiB9LFxucGFydGlhbDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoW10sYmFzZSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKHt9LGJhc2UscmVzdCk7XG4gfVxuIH0sXG5cbmVyZWY6KHQpPT5NLm9yKHQsTS5wcm9taXNlKCkpLFxub3B0Oih0KT0+TS5vcihNLnVuZGVmaW5lZCgpLHQpLFxuXG5pbnRlcmZhY2U6KGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLHtzbG9wcHk9ZmFsc2V9PXt9KT0+e1xuZm9yKGNvbnN0W18sbWV0aG9kR3VhcmRdb2YgZW50cmllcyhtZXRob2RHdWFyZHMpKXtcbm1ldGhvZEd1YXJkLmtsYXNzPT09J21ldGhvZEd1YXJkJ3x8XG5GYWlsIGB1bnJlY29nbml6ZSBtZXRob2QgZ3VhcmQgJHttZXRob2RHdWFyZH1gO1xuIH1cbnJldHVybiBoYXJkZW4oe1xua2xhc3M6J0ludGVyZmFjZScsXG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzLFxuc2xvcHB5fSk7XG5cbiB9LFxuY2FsbDooLi4uYXJnR3VhcmRzKT0+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ3N5bmMnLGFyZ0d1YXJkcyksXG5jYWxsV2hlbjooLi4uYXJnR3VhcmRzKT0+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJyxhcmdHdWFyZHMpLFxuXG5hd2FpdDooYXJnR3VhcmQpPT5tYWtlQXdhaXRBcmdHdWFyZChhcmdHdWFyZCl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19PVxubWFrZVBhdHRlcm5LaXQoKTskaOKAjV9vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRo4oCNX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaOKAjV9vbmNlLmZpdChmaXQpOyRo4oCNX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaOKAjV9vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRo4oCNX29uY2UuYXNzZXJ0S2V5UGF0dGVybihhc3NlcnRLZXlQYXR0ZXJuKTskaOKAjV9vbmNlLmlzS2V5UGF0dGVybihpc0tleVBhdHRlcm4pOyRo4oCNX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjigI1fb25jZS5NKE0pO1xuXG5NTT1NO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJmaXQiOlsiZml0Il0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImFzc2VydEtleVBhdHRlcm4iOlsiYXNzZXJ0S2V5UGF0dGVybiJdLCJpc0tleVBhdHRlcm4iOlsiaXNLZXlQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHMpU07wPAAA8DwAAC4AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlT2YscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA4EE4s9RUAAPUVAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gdGFnXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gdmFsdWVQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiogQHR5cGUgeyhrOiBLLCB2OiBWKSA9PiB2b2lkfSAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2fzG+aw8AAGsPAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc3NldC5rZXlzKCksXG4oayk9Pmpzc2V0LmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG5rZXlOYW1lKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybj19IGtleVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJTZXRTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3IFNldCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ3NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAol+VuphEAAKYRAAA1AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUscGFzc1N0eWxlT2YsZml0LGFzc2VydFBhdHRlcm47JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFqc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5cbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGtleSkpO1xuIH0sXG5cbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGVudHJpZXMpPT57XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMpe1xuLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLlxuICogT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAlIgBZnDQAAZw0AADUAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixmaXQsYXNzZXJ0UGF0dGVybjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNzZXQuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBzZXQuKi9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuZm9yKGNvbnN0IGtleSBvZiBrZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha1NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAqUK3IPBMAADwTAAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmFzc2VydC5lcXVhbChcbmdlbmVyYXRpb24sXG51cGRhdGVDb3VudCxcblggYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYCk7XG5cbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLlxuICogRm9yIHR3byBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGVcbiAqIG90aGVyIGNhbGwgc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLlxuICogKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmQgdHJpZXMgdG8gc3RvcmVcbiAqIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHkgc3RvcmluZyBhIFByb21pc2VcbiAqIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLCBWPn0gc3RvcmVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNQcm92aWRlcj0oc3RvcmUpPT57XG4vKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbmNvbnN0IHBlbmRpbmc9bmV3IE1hcCgpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LFxuICogd2hlbiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFByb21pc2U8Vj59IG1ha2VWYWx1ZSBtYWtlIHRoZSB2YWx1ZSBmb3IgdGhlIHN0b3JlXG4gKiBpZiBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjigI1fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD8gSqBEdQAARHUAACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gS2V5XG4gKiBLZXlzIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIHBhc3NhYmxlIHByaW1pdGl2ZSBkYXRhIG9yXG4gKiBSZW1vdGFibGVzIChGYXIgb2JqZWN0cyBvciB0aGVpciByZW1vdGUgcHJlc2VuY2VzLikgS2V5cyBhcmUgc28gbmFtZWRcbiAqIGJlY2F1c2UgdGhleSBjYW4gYmUgdXNlZCBhcyBrZXlzIGluIE1hcFN0b3JlcyBhbmQgQ29weU1hcHMsIGFzIHdlbGwgYXNcbiAqIHRoZSBlbGVtZW50cyBvZiBDb3B5U2V0cyBhbmQgQ29weUJhZ3MuXG4gKlxuICogS2V5cyBjYW5ub3QgY29udGFpbiBwcm9taXNlcyBvciBlcnJvcnMsIGFzIHRoZXNlIGRvIG5vdCBoYXZlIGEgdXNlZnVsXG4gKiBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuIEtleXMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZFxuICogZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIGtleXMuXG4gKlxuICogRGlzdHJpYnV0ZWQgZXF1YWxpdHkgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBUaGUgc2FtZSB0d28ga2V5cywgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHdpbGwgYmUgYGtleUVRYCB0aGVyZSBpZmZcbiAqIHRoZXkgYXJlIGBrZXlFUWAgaGVyZS4gKGBrZXlFUWAgdGVzdHMgZXF1YWxpdHkgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqIFBhdHRlcm5zIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIEtleXMgb3IgTWF0Y2hlcnMuIEVhY2ggcGF0dGVyblxuICogYWN0cyBhcyBhIGRlY2xhcmF0aXZlIHBhc3NhYmxlIHByZWRpY2F0ZSBvdmVyIHBhc3NhYmxlcywgd2hlcmUgZWFjaCBwYXNzYWJsZVxuICogZWl0aGVyIHBhc3NlcyBhIGdpdmVuIHBhdHRlcm4sIG9yIGRvZXMgbm90LiBFdmVyeSBrZXkgaXMgYWxzbyBhIHBhdHRlcm4uXG4gKiBVc2VkIGFzIGEgcGF0dGVybiwgYSBrZXkgbWF0Y2hlcyBvbmx5IFwiaXRzZWxmXCIsIGkuZS4sIGtleXMgdGhhdCBhcmVcbiAqIGBrZXlFUWAgdG8gaXQsIHRoYXQgaXMsIGVxdWFsIGFjY29yZGluZyB0byB0aGVcbiAqIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuXG4gKlxuICogUGF0dGVybnMgY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLCBhcyB0aGVzZSBkb1xuICogbm90IGhhdmUgYSB1c2VmdWwgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgb3IgbWF0Y2hpbmcgc2VtYW50aWNzLiBMaWtld2lzZSxcbiAqIG5vIHBhdHRlcm4gY2FuIGRpc3Rpbmd1aXNoIGFtb25nIHByb21pc2VzLCBvciBkaXN0aW5ndWlzaCBhbW9uZyBlcnJvcnMuXG4gKiBQYXR0ZXJucyBhbHNvIGNhbm5vdCBjb250YWluIGFueSBDb3B5VGFnZ2VkcyBleGNlcHQgZm9yIHRob3NlIHJlY29nbml6ZWQgYXNcbiAqIENvcHlTZXRzLCBDb3B5QmFncywgQ29weU1hcHMsIG9yIE1hdGNoZXJzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIHBhdHRlcm5zLlxuICpcbiAqIFdoZXRoZXIgYSBwYXNzYWJsZSBtYXRjaGVzIGEgZ2l2ZW4gcGF0dGVybiBpcyBsb2NhdGlvbiBpbmRlcGVuZGVudC5cbiAqIEZvciBhIHBhc3NhYmxlIGFuZCBhIHBhdHRlcm4sIGJvdGggcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHRoZSBwYXNzYWJsZVxuICogd2lsbCBtYXRjaCB0aGUgcGF0dGVybiB0aGVyZSBpZmYgdGhlIHBhc3NhYmxlIG1hdGNoZXMgdGhhdCBwYXR0ZXJuIGhlcmUuXG4gKlxuICogUGF0dGVybnMgYXJlIG9mdGVuIHVzZWQgaW4gYSB0eXBlLWxpa2UgbWFubmVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5XG4gKiBvZiBwYXNzYWJsZXMgdGhhdCBhcmUgaW50ZW5kZWQqIHRvIG1hdGNoIHRoYXQgcGF0dGVybi4gVG8ga2VlcCB0aGlzXG4gKiBkaXN0aW5jdGlvbiBjbGVhciwgd2Ugb2Z0ZW4gdXNlIHRoZSBzdWZmaXggXCJTaGFwZVwiIHJhdGhlciB0aGFuIFwiUGF0dGVyblwiXG4gKiB0byBhdm9pZCB0aGUgbGV2ZWxzIGNvbmZ1c2lvbiB3aGVuIHRoZSBwYXR0ZXJuIGl0c2VsZiByZXByZXNlbnRzXG4gKiBzb21lIGNhdGVnb3J5IG9mIHBhdHRlcm4uIEZvciBleGFtcGxlLCBhbiBcIkFtb3VudFNoYXBlXCIgcmVwcmVzZW50cyB0aGVcbiAqIGNhdGVnb3J5IG9mIEFtb3VudHMuIEFuZCBcIkFtb3VudFBhdHRlcm5TaGFwZVwiIHJlcHJlc2VudHMgdGhlXG4gKiBjYXRlZ29yeSBvZiBwYXR0ZXJucyBvdmVyIEFtb3VudHMuXG4gKlxuICogKiBJIHNheSBcImludGVuZGVkXCIgYWJvdmUgYmVjYXVzZSBQYXR0ZXJucywgaW4gb3JkZXIgdG8gYmUgZGVjbGFyYXRpdmVcbiAqIGFuZCBwYXNzYWJsZSwgY2Fubm90IGhhdmUgdGhlIGdlbmVyYWxpdHkgb2YgcHJlZGljYXRlcyB3cml0dGVuIGluIGFcbiAqIFR1cmluZy11bml2ZXJzYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFJhdGhlciwgdG8gcmVwcmVzZW50IHRoZSBjYXRlZ29yeSBvZlxuICogdGhpbmdzIGludGVuZGVkIHRvIGJlIGEgRm9vLCBhIEZvb1NoYXBlIHNob3VsZCByZWxpYWJseVxuICogYWNjZXB0IGFsbCBGb29zIGFuZCByZWplY3Qgb25seSBub24tRm9vcy4gSG93ZXZlciwgYSBGb29TaGFwZSBtYXkgYWxzbyBhY2NlcHRcbiAqIG5vbi1Gb29zIHRoYXQgXCJsb29rIGxpa2VcIiBvciBoYXZlIFwidGhlIHNhbWUgc2hhcGUgYXNcIiBnZW51aW5lIEZvb3MuIFRvIHdyaXRlXG4gKiBhcyBhY2N1cmF0ZSBwcmVkaWNhdGUsIGZvciB1c2UsIGZvciBleGFtcGxlLCBmb3IgaW5wdXQgdmFsaWRhdGlvbiwgd291bGRcbiAqIG5lZWQgdG8gc3VwcGxlbWVudCB0aGUgcGF0dGVybiBjaGVjayB3aXRoIGNvZGUgdG8gY2hlY2sgZm9yIHRoZSByZXNpZHVhbFxuICogY2FzZXMuXG4gKiBXZSBob3BlIHRoZSBcIlNoYXBlXCIgbWV0YXBob3IgaGVscHMgcmVtaW5kIHVzIG9mIHRoaXMgdHlwZS1saWtlIGltcHJlY2lzaW9uXG4gKiBvZiBwYXR0ZXJucy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weVNldFxuICovXG5cbi8qIFRPRE8gcGFyYW1ldGVyaXplIENvcHlUYWdnZWQgc28gdGhpcyBjYW4gaW5jbHVkZSBpdCovXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nO1xuICogICBwYXlsb2FkOiBBcnJheTxbSywgYmlnaW50XT47XG4gKiB9fSBDb3B5QmFnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weU1hcFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IE1hdGNoZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1BhdHRlcm49fSBrZXlTaGFwZVxuICogQHByb3BlcnR5IHtQYXR0ZXJuPX0gdmFsdWVTaGFwZVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZSwgYnV0IHdpdGggdGhlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGFuZCBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5U2V0PEs+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBtYXBcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuXG4gKiApID0+IEl0ZXJhYmxlPFtLLFZdPn0gZW50cmllc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IENvcHlNYXA8SyxWPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gRGVwcmVjYXRlZCBMZWdhY3kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7V2Vha01hcFN0b3JlPEssVj59IFdlYWtTdG9yZVxuICogRGVwcmVjYXRlZCB0eXBlIG5hbWUgYFdlYWtTdG9yZWAuIFVzZSBgV2Vha01hcFN0b3JlYCBpbnN0ZWFkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge01hcFN0b3JlPEssVj59IFN0b3JlXG4gKiBEZXByZWNhdGVkIHR5cGUgbmFtZSBgU3RvcmVgLiBVc2UgYE1hcFN0b3JlYCBpbnN0ZWFkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5V2Vha01hcFxuICogTGVnYWN5V2Vha01hcCBpcyBkZXByZWNhdGVkLiBVc2UgV2Vha01hcFN0b3JlIGluc3RlYWQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMX0gUmFua0NvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgUmFua0NvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIHJhbmstb3JkZXIsIGkuZS4sXG4gKiBhIHRvdGFsIHByZW9yZGVyIGluIHdoaWNoIGRpZmZlcmVudCBlbGVtZW50cyBhcmUgYWx3YXlzIGNvbXBhcmFibGUgYnV0XG4gKiBjYW4gYmUgdGllZCBmb3IgdGhlIHNhbWUgcmFuay4gU2VlIGBSYW5rQ29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFua0NvbXBhcmVcbiAqIFJldHVybnMgYC0xYCwgYDBgLCBvciBgMWAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJhbmsgb2YgYGxlZnRgXG4gKiBpcyBiZWZvcmUsIHRpZWQtd2l0aCwgb3IgYWZ0ZXIgdGhlIHJhbmsgb2YgYHJpZ2h0YC5cbiAqXG4gKiBUaGlzIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMgdmFsaWQgYXMgYXJndW1lbnQgdG9cbiAqIGBBcnJheS5wcm90b3R5cGUuc29ydGAuIFRoaXMgaXMgc29tZXRpbWVzIGRlc2NyaWJlZCBhcyBhIFwidG90YWwgb3JkZXJcIlxuICogYnV0LCBkZXBlbmRpbmcgb24geW91ciBkZWZpbml0aW9ucywgdGhpcyBpcyB0ZWNobmljYWxseSBpbmNvcnJlY3QgYmVjYXVzZVxuICogaXQgbWF5IHJldHVybiBgMGAgdG8gaW5kaWNhdGUgdGhhdCB0d28gZGlzdGluZ3Vpc2hhYmxlIGVsZW1lbnRzIHN1Y2ggYXNcbiAqIGAtMGAgYW5kIGAwYCBhcmUgdGllZCAoaS5lLiwgYXJlIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzXG4gKiBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgb3JkZXJpbmcpLiBJZiBlYWNoIHN1Y2ggZXF1aXZhbGVuY2UgY2xhc3MgaXNcbiAqIGEgKnJhbmsqIGFuZCByYW5rcyBhcmUgZGlzam9pbnQsIHRoZW4gdGhpcyBcInJhbmsgb3JkZXJcIiBpcyBhXG4gKiB0cnVlIHRvdGFsIG9yZGVyIG92ZXIgdGhlc2UgcmFua3MuIEluIG1hdGhlbWF0aWNzIHRoaXMgZ29lcyBieSBzZXZlcmFsXG4gKiBvdGhlciBuYW1lcyBzdWNoIGFzIFwidG90YWwgcHJlb3JkZXJcIi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGEgdG90YWwgcmFuayBvcmRlciBvdmVyIGFsbCBwYXNzYWJsZXMuXG4gKiBUbyBkbyBzbyBpdCBtYWtlcyBhcmJpdHJhcnkgY2hvaWNlcywgc3VjaCBhcyB0aGF0IGFsbCBzdHJpbmdzXG4gKiBhcmUgYWZ0ZXIgYWxsIG51bWJlcnMuIFRodXMsIHRoaXMgb3JkZXIgaXMgbm90IGludGVuZGVkIHRvIGJlXG4gKiB1c2VkIGRpcmVjdGx5IGFzIGEgY29tcGFyaXNvbiB3aXRoIHVzZWZ1bCBzZW1hbnRpY3MuIEhvd2V2ZXIsIGl0IG11c3QgYmVcbiAqIGNsb3NlbHkgZW5vdWdoIHJlbGF0ZWQgdG8gc3VjaCBjb21wYXJpc29ucyB0byBhaWQgaW4gaW1wbGVtZW50aW5nXG4gKiBsb29rdXBzIGJhc2VkIG9uIHRob3NlIGNvbXBhcmlzb25zLiBGb3IgZXhhbXBsZSwgaW4gb3JkZXIgdG8gZ2V0IGEgdG90YWxcbiAqIG9yZGVyIGFtb25nIHJhbmtzLCB3ZSBwdXQgYE5hTmAgYWZ0ZXIgYWxsIG90aGVyIEphdmFTY3JpcHQgXCJudW1iZXJcIiB2YWx1ZXNcbiAqIChpLmUuLCBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCB2YWx1ZXMpLiBCdXQgb3RoZXJ3aXNlLCB3ZSByYW5rIEphdmFTY3JpcHRcbiAqIG51bWJlcnMgYnkgc2lnbmVkIG1hZ25pdHVkZSwgd2l0aCBgMGAgYW5kIGAtMGAgdGllZC4gQSBzZW1hbnRpY2FsbHkgdXNlZnVsXG4gKiBvcmRlcmluZyB3b3VsZCBhbHNvIGNvbXBhcmUgbWFnbml0dWRlcywgYW5kIHNvIGFncmVlIHdpdGggdGhlIHJhbmsgb3JkZXJpbmdcbiAqIG9mIGFsbCB2YWx1ZXMgb3RoZXIgdGhhbiBgTmFOYC4gQW4gYXJyYXkgc29ydGVkIGJ5IHJhbmsgd291bGQgZW5hYmxlIHJhbmdlXG4gKiBxdWVyaWVzIGJ5IG1hZ25pdHVkZS5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGxlZnRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmFua0NvbXBhcmV9IEZ1bGxDb21wYXJlXG4gKiBBIGBGdWxsQ29tcGFyZWAgZnVuY3Rpb24gc2F0aXNmaWVzIGFsbCB0aGUgaW52YXJpYW50cyBzdGF0ZWQgYmVsb3cgZm9yXG4gKiBgUmFua0NvbXBhcmVgJ3MgcmVsYXRpb24gd2l0aCBLZXlDb21wYXJlLlxuICogSW4gYWRkaXRpb24sIGl0cyBlcXVhbGl0eSBpcyBhcyBwcmVjaXNlIGFzIHRoZSBgS2V5Q29tcGFyZWBcbiAqIGNvbXBhcmlzb24gZGVmaW5lZCBiZWxvdywgaW4gdGhhdCwgZm9yIGFsbCBLZXlzIGB4YCBhbmQgYHlgLFxuICogYEZ1bGxDb21wYXJlKHgsIHkpID09PSAwYCBpZmYgYEtleUNvbXBhcmUoeCwgeSkgPT09IDBgLlxuICpcbiAqIEZvciBub24ta2V5cyBhIGBGdWxsQ29tcGFyZWAgc2hvdWxkIGJlIGV4YWN0bHkgYXMgaW1wcmVjaXNlIGFzXG4gKiBgUmFua0NvbXBhcmVgLiBGb3IgZXhhbXBsZSwgYm90aCB3aWxsIHRyZWF0IGFsbCBlcnJvcnMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgdHJlYXQgYWxsIHByb21pc2VzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIG9yZGVyIHRhZ2dlZHMgdGhlIHNhbWUgd2F5LCB3aGljaCBpcyBhZG1pdHRlZGx5XG4gKiB3ZWlyZCwgYXMgc29tZSB0YWdnZWRzIHdpbGwgYmUgY29uc2lkZXJlZCBrZXlzIGFuZCBvdGhlciB0YWdnZWRzIHdpbGwgYmVcbiAqIGNvbnNpZGVyZWQgbm9uLWtleXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgey0xIHwgMCB8IDEgfCBOYU59IEtleUNvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgS2V5Q29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgbWVhbmluZ2Z1bFxuICogYW5kIG1lYW5pbmdmdWxseSBwcmVjaXNlIHBhcnRpYWwgb3JkZXIgb2YgYEtleWAgdmFsdWVzLiBTZWUgYEtleUNvbXBhcmVgLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEtleUNvbXBhcmVcbiAqIGBjb21wYXJlS2V5c2AgaW1wbGVtZW50cyBhIHBhcnRpYWwgb3JkZXIgb3ZlciBrZXlzLiBBcyB3aXRoIHRoZVxuICogcmFuayBvcmRlcmluZyBwcm9kdWNlZCBieSBgY29tcGFyZVJhbmtgLCAtMSwgMCwgYW5kIDEgbWVhblxuICogXCJsZXNzIHRoYW5cIiwgXCJlcXVpdmFsZW50IHRvXCIsIGFuZCBcImdyZWF0ZXIgdGhhblwiIHJlc3BlY3RpdmVseS5cbiAqIE5hTiBtZWFucyBcImluY29tcGFyYWJsZVwiIC0tLSB0aGUgZmlyc3Qga2V5IGlzIG5vdCBsZXNzLCBlcXVpdmFsZW50LFxuICogb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuIEZvciBleGFtcGxlLCBzdWJzZXRzIG92ZXIgc2V0cyBpc1xuICogYSBwYXJ0aWFsIG9yZGVyLlxuICpcbiAqIEJ5IHVzaW5nIE5hTiBmb3IgXCJpbmNvbXBhcmFibGVcIiwgdGhlIG5vcm1hbCBlcXVpdmFsZW5jZSBmb3IgdXNpbmdcbiAqIHRoZSByZXR1cm4gdmFsdWUgaW4gYSBjb21wYXJpc29uIGlzIHByZXNlcnZlZC5cbiAqIGBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMGAgaWZmIGBsZWZ0YCBpcyBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWl2YWxlbnQgdG8gYHJpZ2h0YCBpbiB0aGUgcGFydGlhbCBvcmRlcmluZy5cbiAqXG4gKiBLZXkgb3JkZXIgKGEgcGFydGlhbCBvcmRlcikgYW5kIHJhbmsgb3JkZXIgKGEgdG90YWwgcHJlb3JkZXIpIGFyZVxuICogY28tZGVzaWduZWQgc28gdGhhdCB3ZSBzdG9yZSBwYXNzYWJsZXMgaW4gcmFuayBvcmRlciBhbmQgaW5kZXggaW50byB0aGVtXG4gKiB3aXRoIGtleXMgZm9yIGtleS1iYXNlZCBxdWVyaWVzLiBUbyBrZWVwIHRoZXNlIGRpc3RpbmN0LCB3aGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IHJhbmssIHdlIHRhbGsgYWJvdXQgXCJlYXJsaWVyXCIgYW5kIFwibGF0ZXJcIi4gV2hlbiBzcGVha2luZ1xuICogaW5mb3JtYWxseSBhYm91dCBrZXlzLCB3ZSB0YWxrIGFib3V0IFwic21hbGxlclwiIGFuZCBcImJpZ2dlclwiLlxuICpcbiAqIEluIGJvdGggb3JkZXJzLCB0aGUgcmV0dXJuLTAgY2FzZSBkZWZpbmVzXG4gKiBhbiBlcXVpdmFsZW5jZSBjbGFzcywgaS5lLiwgdGhvc2UgdGhhdCBhcmUgdGllZCBmb3IgdGhlIHNhbWUgcGxhY2UgaW4gdGhlXG4gKiBvcmRlci4gVGhlIGdsb2JhbCBpbnZhcmlhbnQgdGhhdCB3ZSBuZWVkIGJldHdlZW4gdGhlIHR3byBvcmRlcnMgaXMgdGhhdCB0aGVcbiAqIGtleSBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcyBpcyBhbHdheXMgYXQgbGVhc3QgYXMgcHJlY2lzZSBhcyB0aGVcbiAqIHJhbmsgb3JkZXIgZXF1aXZhbGVuY2UgY2xhc3MuIElPVywgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPT09IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpID09PSAwYC4gQnV0IG5vdCB2aWNlIHZlcnNhLiBGb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudFxuICogcmVtb3RhYmxlcyBhcmUgdGhlIHNhbWUgcmFuayBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogQSBmdXJ0aGVyIGludmFyaWFudCBpcyBpZiBgY29tcGFyZUtleXMoWCxZKSA8IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpIDwgMGAsIGkuZS4sIGlmIFggaXMgc21hbGxlciB0aGFuIFkgaW4ga2V5IG9yZGVyLCB0aGVuIFhcbiAqIG11c3QgYmUgZWFybGllciB0aGFuIFkgaW4gcmFuayBvcmRlci4gQnV0IG5vdCB2aWNlIHZlcnNhLlxuICogWCBjYW4gYmUgZXF1aXZhbGVudCB0byBvciBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyIGFuZCBzdGlsbCBiZVxuICogaW5jb21wYXJhYmxlIHdpdGggWSBpbiBrZXkgb3JkZXIuIEZvciBleGFtcGxlLCB0aGUgcmVjb3JkIGB7YjogMywgYTogNX1gIGlzXG4gKiBlYXJsaWVyIHRoYW4gdGhlIHJlY29yZCBge2I6IDUsIGE6IDN9YCBpbiByYW5rIG9yZGVyIGJ1dCB0aGV5IGFyZVxuICogaW5jb21wYXJhYmxlIGFzIGtleXMuIEFuZCB0d28gZGlzdGluY3QgcmVtb3RhYmxlcyBzdWNoIGFzIGBGYXIoJ1gnLCB7fSlgIGFuZFxuICogYEZhcignWScsIHt9KWAgYXJlIGVxdWl2YWxlbnQgaW4gcmFuayBvcmRlciBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogVGhpcyBsZXRzIHVzIHRyYW5zbGF0ZSBhIHJhbmdlIHNlYXJjaCBvdmVyIHRoZVxuICogcGFydGlhbCBrZXkgb3JkZXIgaW50byBhIHJhbmdlIHNlYXJjaCBvdmVyIHJhbmsgb3JkZXIgZm9sbG93ZWQgYnkgZmlsdGVyaW5nXG4gKiBvdXQgdGhvc2UgdGhhdCBkb24ndCBtYXRjaC4gVG8gZ2V0IHRoaXMgZWZmZWN0LCB3ZSBzdG9yZSB0aGUgZWxlbWVudHMgb2ZcbiAqIGEgc2V0IGluIGFuIGFycmF5IHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXIsIGZyb20gbGF0ZXIgdG8gZWFybGllci5cbiAqIENvbWJpbmVkIHdpdGggb3VyIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiBhcnJheXMsIGlmIHNldCBYIGlzIGEgc3Vic2V0XG4gKiBvZiBzZXQgWSB0aGVuIHRoZSBhcnJheSByZXByZXNlbnRpbmcgc2V0IFggd2lsbCBiZSBhbiBlYXJsaWVyIHJhbmsgdGhhdCB0aGVcbiAqIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWS5cbiAqXG4gKiBAcGFyYW0ge0tleX0gbGVmdFxuICogQHBhcmFtIHtLZXl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gU2hvdWxkIGJlIGludGVybmFsIG9ubHkgdHlwZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge1tzdHJpbmcsIHN0cmluZ119IFJhbmtDb3ZlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRQYXNzU3R5bGVDb3ZlclxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluZGV4Q292ZXJcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb3ZlcmVkRW50cmllc1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tQYXR0ZXJuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhbGxlZ2VkUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tLZXlQYXR0ZXJuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhbGxlZ2VkUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5VG9EQktleVxuICogSWYgdGhpcyBrZXkgY2FuIGJlIGVuY29kZWQgYXMgYSBEQktleSBzdHJpbmcgd2hpY2ggc29ydHMgY29ycmVjdGx5LFxuICogcmV0dXJuIHRoYXQgc3RyaW5nLiBFbHNlIHJldHVybiBgdW5kZWZpbmVkYC4gRm9yIGV4YW1wbGUsIGEgc2NhbGFyLW9ubHlcbiAqIGVuY29kZVBhc3NhYmxlIHdvdWxkIHJldHVybiBgdW5kZWZpbmVkYCBmb3IgYWxsIG5vbi1zY2FsYXIga2V5cy5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UmFua0NvdmVyXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7S2V5VG9EQktleX0gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbGxMaW1pdHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzdHJpbmdMZW5ndGhMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN5bWJvbE5hbWVMZW5ndGhMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVByb3BlcnRpZXNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByb3BlcnR5TmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gYXJyYXlMZW5ndGhMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVNldEVsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtTWFwRW50cmllc0xpbWl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxBbGxMaW1pdHM+fSBMaW1pdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoZXJOYW1lc3BhY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYW55XG4gKiBNYXRjaGVzIGFueSBwYXNzYWJsZVxuICogQHByb3BlcnR5IHsoLi4ucGF0dHM6IFBhdHRlcm5bXSkgPT4gTWF0Y2hlcn0gYW5kXG4gKiBPbmx5IGlmIGl0IG1hdGNoZXMgYWxsIHRoZSBzdWItcGF0dGVybnNcbiAqIEBwcm9wZXJ0eSB7KC4uLnBhdHRzOiBQYXR0ZXJuW10pID0+IE1hdGNoZXJ9IG9yXG4gKiBPbmx5IGlmIGl0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIHN1YlBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdHQ6IFBhdHRlcm4pID0+IE1hdGNoZXJ9IG5vdFxuICogT25seSBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgc3ViLXBhdHRlcm5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHNjYWxhclxuICogVGhlIHNjYWxhcnMgYXJlIHRoZSBwcmltaXRpdmUgdmFsdWVzIGFuZCBSZW1vdGFibGVzLlxuICogQWxsIHNjYWxhcnMgYXJlIGtleXMuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGtleVxuICogQ2FuIGJlIGluIGEgY29weVNldCBvciBDb3B5QmFnLCBvciB0aGUga2V5IGluIGEgQ29weU1hcC5cbiAqIChXaWxsIGV2ZW50dWFsbHkgYmUgYWJsZSB0byBhIGtleSBpcyBhIE1hcFN0b3JlLilcbiAqIEFsbCBrZXlzIGFyZSBwYXR0ZXJucyB0aGF0IG1hdGNoIG9ubHkgdGhlbXNlbHZlcy5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gcGF0dGVyblxuICogSWYgaXQgbWF0Y2hlcyBNLnBhdHRlcm4oKSwgdGhlIGl0IGlzIGl0c2VsZiBhIHBhdHRlcm4gdXNlZFxuICogdG8gbWF0Y2ggb3RoZXIgcGFzc2FibGVzLiBBIHBhdHRlcm4gY2Fubm90IGNvbnRhaW4gZXJyb3JzXG4gKiBvciBwcm9taXNlcywgYXMgdGhlc2UgYXJlIG5vdCBzdGFibGUgZW5vdWdoIHRvIHVzZWZ1bGx5IG1hdGNoLlxuICogQHByb3BlcnR5IHsoa2luZDogc3RyaW5nKSA9PiBNYXRjaGVyfSBraW5kXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGJvb2xlYW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gbnVtYmVyIE9ubHkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyc1xuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBiaWdpbnRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gbmF0XG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHN0cmluZ1xuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzeW1ib2xcbiAqIE9ubHkgcmVnaXN0ZXJlZCBhbmQgd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZVxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSByZWNvcmQgQSBDb3B5UmVjb3JkXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGFycmF5IEEgQ29weUFycmF5XG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHNldCBBIENvcHlTZXRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmFnIEEgQ29weUJhZ1xuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBtYXAgQSBDb3B5TWFwXG4gKiBAcHJvcGVydHkgeyhsYWJlbD86IHN0cmluZykgPT4gTWF0Y2hlcn0gcmVtb3RhYmxlXG4gKiBBIGZhciBvYmplY3Qgb3IgaXRzIHJlbW90ZSBwcmVzZW5jZS4gVGhlIG9wdGlvbmFsIGBsYWJlbGAgaXMgcHVyZWx5IGZvclxuICogZGlhZ25vc3RpYyBwdXJwb3NlLiBJdCBkb2VzIG5vdCBlbmZvcmNlIGFueSBjb25zdHJhaW50IGJleW9uZCB0aGVcbiAqIG11c3QtYmUtYS1yZW1vdGFibGUgY29uc3RyYWludC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gZXJyb3JcbiAqIEVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlLCBidXQgYXJlIG5laXRoZXIga2V5cyBub3Igc3ltYm9scy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHByb21pc2VcbiAqIFByb21pc2VzIGFyZSBwYXNzYWJsZSwgYnV0IGFyZSBuZWl0aGVyIGtleXMgbm9yIHN5bWJvbHMuXG4gKiBUaGV5IGRvIG5vdCBoYXZlIGEgdXNlZnVsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSB1bmRlZmluZWRcbiAqIEFsbCBrZXlzIGluY2x1ZGluZyBgdW5kZWZpbmVkYCBhcmUgYWxyZWFkeSB2YWxpZCBwYXR0ZXJucyBhbmRcbiAqIHNvIGNhbiB2YWxpZGx5IHJlcHJlc2VudCB0aGVtc2VsdmVzLiBCdXQgb3B0aW9uYWwgcGF0dGVybiBhcmd1bWVudHNcbiAqIGAocGF0dGVybiA9IHVuZGVmaW5lZCkgPT4gLi4uYFxuICogY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYHVuZGVmaW5lZGAgcGFzc2VkIGFzIGEgcGF0dGVybiB2c1xuICogb21pc3Npb24gb2YgdGhlIGFyZ3VtZW50LiBJdCB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgYXMgdGhlXG4gKiBzZWNvbmQuIFRodXMsIHdoZW4gYSBwYXNzZWQgcGF0dGVybiBkb2VzIG5vdCBhbHNvIG5lZWQgdG8gYmUgYSBrZXksXG4gKiB3ZSByZWNvbW1lbmQgcGFzc2luZyBgTS51bmRlZmluZWQoKWAgaW5zdGVhZCBvZiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IG51bGx9IG51bGxcbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRcbiAqIE1hdGNoZXMgaWYgPCB0aGUgcmlnaHQgb3BlcmFuZCBieSBjb21wYXJlS2V5c1xuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGx0ZVxuICogTWF0Y2hlcyBpZiA8PSB0aGUgcmlnaHQgb3BlcmFuZCBieSBjb21wYXJlS2V5c1xuICogQHByb3BlcnR5IHsoa2V5IDpLZXkpID0+IE1hdGNoZXJ9IGVxXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gbmVxXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gZ3RlXG4gKiBNYXRjaGVzIGlmID49IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gZ3RcbiAqIE1hdGNoZXMgaWYgPiB0aGUgcmlnaHQgb3BlcmFuZCBieSBjb21wYXJlS2V5c1xuICpcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdHQ/OiBQYXR0ZXJuLCBsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGFycmF5T2ZcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSByZWNvcmRPZlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc2V0T2ZcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgY291bnRQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBiYWdPZlxuICogUGFyYW1ldGVyaXplZCBieSBhIGtleVBhdHQgdGhhdCBpcyBtYXRjaGVkIGFnYWluc3QgZXZlcnkgZWxlbWVudCBvZiB0aGVcbiAqIGFic3RyYWN0IGJhZy4gSW4gdGVybXMgb2YgdGhlIGJhZyByZXByZXNlbnRhdGlvbiwgaXQgaXMgbWF0Y2hlZCBhZ2FpbnN0XG4gKiB0aGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHBhaXIuIElmIHRoZSBzZWNvbmQgYGNvdW50UGF0dGAgaXMgcHJvdmlkZWQsXG4gKiBpdCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGNhcmRpbmFsaXR5IG9mIGVhY2ggZWxlbWVudC4gVGhlIGBjb3VudFBhdHRgXG4gKiBpcyByYXJlbHkgZXhwZWN0ZWQgdG8gYmUgdXNlZnVsLCBidXQgaXMgcHJvdmlkZWQgdG8gbWluaW1pemUgc3VycHJpc2UuXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIHZhbHVlUGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gbWFwT2ZcbiAqXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogUGF0dGVybltdLFxuICogICAgICAgICAgICAgb3B0aW9uYWw/OiBQYXR0ZXJuW10sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRBcnJheVxuICogU3BsaXRzIGFuIGFycmF5IC0tLSB0eXBpY2FsbHkgYW4gYXJndW1lbnRzIGxpc3QgLS0tIGludG8gYW4gaW5pdGlhbFxuICogcG9ydGlvbiB0aGF0IG1hdGNoZXMgdGhlIGByZXF1aXJlZGAgcGF0dGVybiwgdGhlbiB0aGUgcG9ydGlvbiB0aGF0IG1hdGNoZXNcbiAqIHRoZSBgb3B0aW9uYWxgIHBhdHRlcm4sIGFuZCB0aGUgcmVtYWluZGVyIHdoaWNoIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGVcbiAqIGByZXN0YCBwYXR0ZXJuLiBUaGUgc3BlY2ltZW4gbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBgcmVxdWlyZWRgXG4gKiBwYXR0ZXJuLCBidXQgdGhlIHJlbWFpbmRlciBjYW4gYmUgc2hvcnRlciB0aGFuIHRoZSBgb3B0aW9uYWxgIHBhdHRlcm4uXG4gKiBXaXRoaW4gdGhlIG9wdGlvbmFsIHBvcnRpb24sIGFuIGB1bmRlZmluZWRgIGFyZyBtYXRjaGVzIHVuY29uZGl0aW9uYWxseS5cbiAqIEFueSBlbGVtZW50cyBiZXlvbmQgdGhlIGBvcHRpb25hbGAgcGF0dGVybiBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICogYHJlc3RgIHBhdHRlcm4uXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogQ29weVJlY29yZDxQYXR0ZXJuPixcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogQ29weVJlY29yZDxQYXR0ZXJuPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBzcGxpdFJlY29yZFxuICogU3BsaXRzIGEgY29weVJlY29yZCBpbnRvIHRob3NlIHByb3BlcnRpZXMgdGhhdCBtYXRjaCB0aGUgYHJlcXVpcmVkYFxuICogcGF0dGVybiwgdGhlIHJlbWFpbmRlciB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBvcHRpb25hbGAgcGF0dGVybi5cbiAqIEFueSBwcm9wZXJ0aWVzIG5vdCBtYXRjaGVkIGJ5IGVpdGhlciBhcmUgZ2F0aGVyZWQgaW50byBhIHJlY29yZCB0aGF0XG4gKiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGByZXN0YCBwYXR0ZXJuLlxuICogVGhlIHNwZWNpbWVuIG11c3QgaGF2ZSBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCBhcHBlYXIgb24gdGhlIGByZXF1aXJlZGBcbiAqIHBhdHRlcm4uIEl0IG1heSBvbWl0IHByb3BlcnRpZXMgdGhhdCBhcHBlYXIgb24gdGhlIG9wdGlvbmFsIHBhdHRlcm4uXG4gKiBGb3IgdGhlc2UgcHVycG9zZXMsIGB1bmRlZmluZWRgIGlzIGxpa2Ugb21pc3Npb24gLS0tIHN1Y2ggcHJvcGVydGllc1xuICogcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRcbiAqIERlcHJlY2F0ZWQuIFVzZSBgTS5zcGxpdEFycmF5YCBvciBgTS5zcGxpdFJlY29yZGAgaW5zdGVhZC5cbiAqXG4gKiBBbiBhcnJheSBvciByZWNvcmQgaXMgc3BsaXQgaW50byB0aGUgZmlyc3QgcGFydCB0aGF0IG1hdGNoZXMgdGhlXG4gKiBiYXNlIHBhdHRlcm4sIGFuZCB0aGUgcmVtYWluZGVyLCB3aGljaCBtYXRjaGVzIGFnYWluc3QgdGhlIG9wdGlvbmFsXG4gKiByZXN0IHBhdHRlcm4gaWYgcHJlc2VudC5cbiAqIEBwcm9wZXJ0eSB7KGJhc2U6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gcGFydGlhbFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICpcbiAqIEFuIGFycmF5IG9yIHJlY29yZCBpcyBzcGxpdCBpbnRvIHRoZSBmaXJzdCBwYXJ0IHRoYXQgbWF0Y2hlcyB0aGVcbiAqIGJhc2UgcGF0dGVybiwgYW5kIHRoZSByZW1haW5kZXIsIHdoaWNoIG1hdGNoZXMgYWdhaW5zdCB0aGUgb3B0aW9uYWxcbiAqIHJlc3QgcGF0dGVybiBpZiBwcmVzZW50LlxuICogVW5saWtlIGBNLnNwbGl0YCwgYE0ucGFydGlhbGAgaWdub3JlcyBwcm9wZXJ0aWVzIG9uIHRoZSBiYXNlXG4gKiBwYXR0ZXJuIHRoYXQgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBzcGVjaW1lbi5cbiAqXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBlcmVmXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBvcHRcbiAqXG4gKiBAcHJvcGVydHkgezxNIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4oaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogICAgICAgICAgICAgbWV0aG9kR3VhcmRzOiBNLFxuICogICAgICAgICAgICAgb3B0aW9ucz86IHtzbG9wcHk/OiBib29sZWFufVxuICogKSA9PiBJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGxcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW5cbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdFxuICovXG5cbi8qKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZCAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSB0aGlzIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvYmplY3QgaXQgZ3VhcmRzKi9cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAqIGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqIG1ldGhvZEd1YXJkczogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+XG4gKiBzbG9wcHk/OiBib29sZWFuXG4gKiB9fSBJbnRlcmZhY2VHdWFyZFxuICovXG5cbi8qKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBhIHBhcmFtZXRlciBsaXN0IGxpa2UgZm9vKGEsIGIsIGMgPSBkLCDigKZlKSA9PiBmIHNob3VsZCBiZSBndWFyZGVkIGJ5XG4gKiBzb21ldGhpbmcgbGlrZVxuICogZm9vOiBNLmNhbGwoQVNoYXBlLCBCU2hhcGUpLm9wdGlvbmFsKENTaGFwZSkucmVzdChFU2hhcGUpLnJldHVybnMoRlNoYXBlKVxuICogb3B0aW9uYWwgaXMgZm9yIG9wdGlvbmFsICg9KSBwYXJhbXMuIHJlc3QgaXMgZm9yIOKApiAodmFyYXJncykgcGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBmaXRcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydEtleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc0tleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIHR5cGUgc2hvdWxkIGJlIGluIGludGVybmFsLXR5cGVzLmpzLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgaW4qL1xuLyogaW4gaW50ZXJuYWwtdHlwZXMuanMgYW5kIGV4cG9ydHMuanMqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnP1xuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0c1xuICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj9cbiAqXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcGF5bG9hZDogUGFzc2FibGUsXG4gKiAgIGVuY29kZVBhc3NhYmxlOiBLZXlUb0RCS2V5XG4gKiApID0+IFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXR0ZXJuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrS2V5UGF0dGVyblxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBhdHRlcm4gZm9yIHVzZSBhcyBhIHF1ZXJ5IGtleSBvciBrZXkgc2hhcGU/XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFueZRq4iAACuIgAALgAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9mYXItY2xhc3MtdXRpbHMuanN7ImltcG9ydHMiOlsiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJDbGFzcyIsInZpdmlmeUZhckNsYXNzS2l0Iiwidml2aWZ5RmFySW5zdGFuY2UiLCJ2aXZpZnlTaW5nbGV0b24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByb3ZpZGVLaW5kSGFuZGxlLGRlZmluZUtpbmQsZGVmaW5lS2luZE11bHRpLGRlZmluZUR1cmFibGVLaW5kLGRlZmluZUR1cmFibGVLaW5kTXVsdGkscHJvdmlkZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCIuL2tpbmQtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVLaW5kSGFuZGxlXCIsIFskaOKAjV9hID0+IChwcm92aWRlS2luZEhhbmRsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJkZWZpbmVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVLaW5kID0gJGjigI1fYSldXSxbXCJkZWZpbmVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZE11bHRpID0gJGjigI1fYSldXSxbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EZWZpbmVLaW5kT3B0aW9uczxUPn0gRGVmaW5lS2luZE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldDxUPn0gS2luZEZhY2V0ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXRzPFQ+fSBLaW5kRmFjZXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFMsVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lVmlydHVhbEZhckNsYXNzPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVLaW5kKHRhZyxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEZhckNsYXNzKGRlZmluZVZpcnR1YWxGYXJDbGFzcyk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUyB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdChkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQpO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUR1cmFibGVGYXJDbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVGYXJDbGFzcyhkZWZpbmVEdXJhYmxlRmFyQ2xhc3MpO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUZhckNsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RmFyQ2xhc3M9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVGYXJDbGFzcyhcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3Modml2aWZ5RmFyQ2xhc3MpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJDbGFzc0tpdD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3NLaXQodml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUZhckluc3RhbmNlPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXZpdmlmeUZhckNsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFuIGFyYml0cmFyeSB0eXBlKi9cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGB0aGVfJHtraW5kTmFtZX1gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07JGjigI1fb25jZS52aXZpZnlGYXJJbnN0YW5jZSh2aXZpZnlGYXJJbnN0YW5jZSk7XG5oYXJkZW4odml2aWZ5RmFySW5zdGFuY2UpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJJbnN0YW5jZSBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVNpbmdsZXRvbj0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbnZpdmlmeUZhckluc3RhbmNlKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlTaW5nbGV0b24odml2aWZ5U2luZ2xldG9uKTtcbmhhcmRlbih2aXZpZnlTaW5nbGV0b24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZVZpcnR1YWxGYXJDbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIl0sImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFyQ2xhc3MiOlsidml2aWZ5RmFyQ2xhc3MiXSwidml2aWZ5RmFyQ2xhc3NLaXQiOlsidml2aWZ5RmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFySW5zdGFuY2UiOlsidml2aWZ5RmFySW5zdGFuY2UiXSwidml2aWZ5U2luZ2xldG9uIjpbInZpdmlmeVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPyzk/PQYAAD0GAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZmFyLWNsYXNzLXV0aWxzLmpzIiwiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsInZpdmlmeUZhckNsYXNzIiwidml2aWZ5RmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJJbnN0YW5jZSIsInZpdmlmeVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOlsiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4va2luZC11dGlscy5qc1wiLCBbXV0sW1wiLi9mYXItY2xhc3MtdXRpbHMuanNcIiwgW1tcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiXV1dLFtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiXV1dLFtcInZpdmlmeUZhckNsYXNzXCIsIFskaOKAjV9saXZlW1widml2aWZ5RmFyQ2xhc3NcIl1dXSxbXCJ2aXZpZnlGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeUZhckNsYXNzS2l0XCJdXV0sW1widml2aWZ5RmFySW5zdGFuY2VcIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiXV1dLFtcInZpdmlmeVNpbmdsZXRvblwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeVNpbmdsZXRvblwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzIixmYWxzZV0sImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckNsYXNzIjpbInZpdmlmeUZhckNsYXNzIixmYWxzZV0sInZpdmlmeUZhckNsYXNzS2l0IjpbInZpdmlmeUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckluc3RhbmNlIjpbInZpdmlmeUZhckluc3RhbmNlIixmYWxzZV0sInZpdmlmeVNpbmdsZXRvbiI6WyJ2aXZpZnlTaW5nbGV0b24iLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAI8gotDQJAAA0CQAAKQAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJpZ25vcmVDb250ZXh0IiwicHJvdmlkZUtpbmRIYW5kbGUiLCJ2aXZpZnlLaW5kIiwidml2aWZ5S2luZE11bHRpIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHByb3ZpZGUsZGVmaW5lRHVyYWJsZUtpbmQsZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxtYWtlS2luZEhhbmRsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcIm1ha2VLaW5kSGFuZGxlXCIsIFskaOKAjV9hID0+IChtYWtlS2luZEhhbmRsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qKlxuICogTWFrZSBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBraW5kIGNvbnRleHQgYnV0XG4gKiBpZ25vcmVzIGl0LlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIEZ1bmN0aW9uPihmbjogVCkgPT4gWGltcG9ydCgnLi90eXBlcy5qcycpLlBsdXNDb250ZXh0PG5ldmVyLCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGlnbm9yZUNvbnRleHQ9XG4oZm4pPT5cbihfY29udGV4dCwuLi5hcmdzKT0+XG5mbiguLi5hcmdzKTskaOKAjV9vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTskaOKAjV9vbmNlLnByb3ZpZGVLaW5kSGFuZGxlKHByb3ZpZGVLaW5kSGFuZGxlKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHZpdmlmeUZhckNsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVml2aWZ5S2luZH1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5S2luZCh2aXZpZnlLaW5kKTtcblxuaGFyZGVuKHZpdmlmeUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJDbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlZpdmlmeUtpbmRNdWx0aX1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmRNdWx0aT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUtpbmRNdWx0aSh2aXZpZnlLaW5kTXVsdGkpO1xuXG5oYXJkZW4odml2aWZ5S2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwidml2aWZ5S2luZCI6WyJ2aXZpZnlLaW5kIl0sInZpdmlmeUtpbmRNdWx0aSI6WyJ2aXZpZnlLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArcdmbcocAADKHAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJNIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsTSxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJNXCJdXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV0sW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmKCdWYXREYXRhJ2luIGdsb2JhbFRoaXMpe1xuYXNzZXJ0KGdsb2JhbFRoaXMuVmF0RGF0YSwnVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PmFzc2VydC5mYWlsKCdWYXREYXRhIHVuYXZhaWxhYmxlJyk7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRmFyQ2xhc3Nlcy9GYXJJbnN0YW5jZXMgaW5zdGVhZCBvZiBraW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlBpY2tGYWNldH1cbiAqLyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGB2aXZpZnkqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmUgaW4gdGhlIHNhbWUgdmF0IGluY2FybmF0aW9uIHdpdGggdGhlIHNhbWVcbiAqIGJhZ2dhZ2Usa2V5IHBhaXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGU9cHJvdmlkZUxhenk7JGjigI1fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuXG5jb25zdCAgICAgICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+bWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9Pm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWV9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Ik0iOlsiTSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADtoFLupxAAAKcQAAA0AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiXSwiZXhwb3J0cyI6WyJpc09mZmVyU2FmZSIsInNhdGlzZmllc1dhbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNPZmZlclNhZmUsICduYW1lJywge3ZhbHVlOiBcImlzT2ZmZXJTYWZlXCJ9KTskaOKAjV9vbmNlLmlzT2ZmZXJTYWZlKGlzT2ZmZXJTYWZlKTsgICBcblxuLyoqXG4gKiBIZWxwZXIgdG8gcGVyZm9ybSBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlLiBJc1xuICogYWxsb2NhdGlvbkFtb3VudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVxdWlyZWRBbW91bnQgZm9yIGV2ZXJ5XG4gKiBrZXl3b3JkIG9mIGdpdmVPcldhbnQ/XG4gKlxuICogVG8gcHJlcGFyZSBmb3IgbXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlIHJldHVybiAwIG9yIDEuXG4gKiBpc09mZmVyU2FmZSB3aWxsIHN0aWxsIGJlIGJvb2xlYW4uIFdoZW4gd2UgaGF2ZSBNdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kXG4gKiBzYXRpc2ZpZXNHaXZlIHdpbGwgdGVsbCBob3cgbWFueSB0aW1lcyB0aGUgb2ZmZXIgd2FzIG1hdGNoZWQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnaXZlT3JXYW50XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb25cbiAqIEByZXR1cm5zIHswfDF9XG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsPShnaXZlT3JXYW50PXt9LGFsbG9jYXRpb24pPT57XG5jb25zdCBpc0dURUJ5S2V5d29yZD0oW2tleXdvcmQscmVxdWlyZWRBbW91bnRdKT0+e1xuLyogSWYgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBmb3IgYSBrZXl3b3JkLCB3ZSBrbm93IHRoZSBnaXZlT3JXYW50Ki9cbi8qIGlzIG5vdCBzYXRpc2ZpZWQgd2l0aG91dCBjaGVja2luZyBmdXJ0aGVyLiovXG5pZihhbGxvY2F0aW9uW2tleXdvcmRdPT09dW5kZWZpbmVkKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGFsbG9jYXRpb25BbW91bnQ9YWxsb2NhdGlvbltrZXl3b3JkXTtcbnJldHVybiBBbW91bnRNYXRoLmlzR1RFKGFsbG9jYXRpb25BbW91bnQscmVxdWlyZWRBbW91bnQpPzE6MDtcbiB9O1xucmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKT8xOjA7XG4gfTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIHNhdGlzZnkgd2hhdCB0aGUgdXNlciB3YW50ZWQsIHRoZWlyXG4gKiBhbGxvY2F0ZWQgYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcm9wb3NhbC53YW50LlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5jb25zdCBzYXRpc2ZpZXNXYW50PShwcm9wb3NhbCxhbGxvY2F0aW9uKT0+XG5zYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC53YW50LGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gY291bnQgYXMgYSBmdWxsIHJlZnVuZCwgdGhlIGFsbG9jYXRlZFxuICogYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB3aGF0IHdhcyBvcmlnaW5hbGx5XG4gKiBvZmZlcmVkIChwcm9wb3NhbC5naXZlKS5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovJGjigI1fb25jZS5zYXRpc2ZpZXNXYW50KHNhdGlzZmllc1dhbnQpO1xuY29uc3Qgc2F0aXNmaWVzR2l2ZT0ocHJvcG9zYWwsYWxsb2NhdGlvbik9Plxuc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwuZ2l2ZSxhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBgaXNPZmZlclNhZmVgIGNoZWNrcyBvZmZlciBzYWZldHkgZm9yIGEgc2luZ2xlIG9mZmVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLmdpdmVgIChnaXZpbmcgYSByZWZ1bmQpIG9yIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLndhbnRgLiBCb3RoIGNhbiBiZSBmdWxseSBzYXRpc2ZpZWQuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNPZmZlclNhZmUocHJvcG9zYWwsYWxsb2NhdGlvbil7XG5yZXR1cm4oXG5zYXRpc2ZpZXNHaXZlKHByb3Bvc2FsLGFsbG9jYXRpb24pPjB8fFxuc2F0aXNmaWVzV2FudChwcm9wb3NhbCxhbGxvY2F0aW9uKT4wKTtcblxuIH1cblxuaGFyZGVuKGlzT2ZmZXJTYWZlKTtcbmhhcmRlbihzYXRpc2ZpZXNXYW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzYXRpc2ZpZXNXYW50IjpbInNhdGlzZmllc1dhbnQiXSwiaXNPZmZlclNhZmUiOlsiaXNPZmZlclNhZmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0p7ugOAbAADgGwAAOAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzeyJpbXBvcnRzIjpbIi4vc2FmZU1hdGguanMiLCJAYWdvcmljL25hdCJdLCJleHBvcnRzIjpbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNWYWx1ZVRvUmVtb3ZlIiwiZ2V0SW5wdXRQcmljZSIsImdldE91dHB1dFByaWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxuYXRTYWZlTWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7c3VidHJhY3QsYWRkLG11bHRpcGx5LGZsb29yRGl2aWRlfT1uYXRTYWZlTWF0aDtcbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCBCQVNJU19QT0lOVFM9MTAwMDBuOy8qIFRPRE8gY2hhbmdlIHRvIDEwXzAwMG4gb25jZSB0b29saW5nIGNvcGVzLiovXG5cbi8qKlxuICogQ2FsY3VsYXRpb25zIGZvciBjb25zdGFudCBwcm9kdWN0IG1hcmtldHMgbGlrZSBVbmlzd2FwLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3J1bnRpbWV2ZXJpZmljYXRpb24vdmVyaWZpZWQtc21hcnQtY29udHJhY3RzL2Jsb2IvdW5pc3dhcC91bmlzd2FwL3gteS1rLnBkZlxuICovXG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBjYWxjdWxhdGluZyBob3cgbXVjaCBzaG91bGQgYmUgZ2l2ZW5cbiAqIGJhY2sgdG8gdGhlIHVzZXIgaW4gZXhjaGFuZ2UgZm9yIHdoYXQgdGhleSBzZW50IGluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IGlucHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHNlbnRcbiAqIGluIHRvIGJlIHN3YXBwZWRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCBzZW50IGluXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzPTMwbl0gLSB0aGUgZmVlIHRha2VuIGluXG4gKiBiYXNpcyBwb2ludHMuIFRoZSBkZWZhdWx0IGlzIDAuMyUgb3IgMzAgYmFzaXMgcG9pbnRzLiBUaGUgZmVlXG4gKiBpcyB0YWtlbiBmcm9tIGlucHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gb3V0cHV0VmFsdWUgLSB0aGUgY3VycmVudCBwcmljZSwgaW4gdmFsdWUgZm9ybVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5wdXRQcmljZT0oXG5pbnB1dFZhbHVlLFxuaW5wdXRSZXNlcnZlLFxub3V0cHV0UmVzZXJ2ZSxcbmZlZUJhc2lzUG9pbnRzPTMwbik9Plxue1xuaW5wdXRWYWx1ZT1OYXQoaW5wdXRWYWx1ZSk7XG5pbnB1dFJlc2VydmU9TmF0KGlucHV0UmVzZXJ2ZSk7XG5vdXRwdXRSZXNlcnZlPU5hdChvdXRwdXRSZXNlcnZlKTtcbmFzc2VydChpbnB1dFZhbHVlPjBuLFggYGlucHV0VmFsdWUgJHtpbnB1dFZhbHVlfSBtdXN0IGJlIHBvc2l0aXZlYCk7XG5hc3NlcnQoaW5wdXRSZXNlcnZlPjBuLFggYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWApO1xub3V0cHV0UmVzZXJ2ZT4wbnx8XG5hc3NlcnQuZmFpbChYIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWApO1xuXG5jb25zdCBvbmVNaW51c0ZlZVNjYWxlZD1zdWJ0cmFjdChCQVNJU19QT0lOVFMsZmVlQmFzaXNQb2ludHMpO1xuY29uc3QgaW5wdXRXaXRoRmVlPW11bHRpcGx5KGlucHV0VmFsdWUsb25lTWludXNGZWVTY2FsZWQpO1xuY29uc3QgbnVtZXJhdG9yPW11bHRpcGx5KGlucHV0V2l0aEZlZSxvdXRwdXRSZXNlcnZlKTtcbmNvbnN0IGRlbm9taW5hdG9yPWFkZChtdWx0aXBseShpbnB1dFJlc2VydmUsQkFTSVNfUE9JTlRTKSxpbnB1dFdpdGhGZWUpO1xucmV0dXJuIGZsb29yRGl2aWRlKG51bWVyYXRvcixkZW5vbWluYXRvcik7XG4gfTtcblxuLyoqXG4gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIGNhbGN1bGF0aW5nIGhvdyBtdWNoIHNob3VsZCBiZSB0YWtlblxuICogZnJvbSB0aGUgdXNlciBpbiBleGNoYW5nZSBmb3Igd2hhdCB0aGV5IHdhbnQgdG8gb2J0YWluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IG91dHB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCB0aGUgdXNlciB3YW50c1xuICogdG8gZ2V0XG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGFzc2V0IGJlaW5nIHNwZW50XG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzPTMwbl0gLSB0aGUgZmVlIHRha2VuIGluXG4gKiBiYXNpcyBwb2ludHMuIFRoZSBkZWZhdWx0IGlzIDAuMyUgb3IgMzAgYmFzaXMgcG9pbnRzLiBUaGUgZmVlIGlzIHRha2VuIGZyb21cbiAqIG91dHB1dFZhbHVlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IGlucHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgaW5wdXQgcmVxdWlyZWQgdG8gcHVyY2hhc2Ugb3V0cHV0XG4gKi8kaOKAjV9vbmNlLmdldElucHV0UHJpY2UoZ2V0SW5wdXRQcmljZSk7XG5jb25zdCAgICAgICAgZ2V0T3V0cHV0UHJpY2U9KFxub3V0cHV0VmFsdWUsXG5pbnB1dFJlc2VydmUsXG5vdXRwdXRSZXNlcnZlLFxuZmVlQmFzaXNQb2ludHM9MzBuKT0+XG57XG5vdXRwdXRWYWx1ZT1OYXQob3V0cHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xub3V0cHV0UmVzZXJ2ZT1OYXQob3V0cHV0UmVzZXJ2ZSk7XG5cbmFzc2VydChpbnB1dFJlc2VydmU+MG4sWCBgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYCk7XG5vdXRwdXRSZXNlcnZlPjBufHxcbmFzc2VydC5mYWlsKFggYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYCk7XG5vdXRwdXRSZXNlcnZlPm91dHB1dFZhbHVlfHxcbmFzc2VydC5mYWlsKFxuWCBgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIG91dHB1dFZhbHVlICR7b3V0cHV0VmFsdWV9YCk7XG5cblxuY29uc3Qgb25lTWludXNGZWVTY2FsZWQ9c3VidHJhY3QoQkFTSVNfUE9JTlRTLGZlZUJhc2lzUG9pbnRzKTtcbmNvbnN0IG51bWVyYXRvcj1tdWx0aXBseShtdWx0aXBseShvdXRwdXRWYWx1ZSxpbnB1dFJlc2VydmUpLEJBU0lTX1BPSU5UUyk7XG5jb25zdCBkZW5vbWluYXRvcj1tdWx0aXBseShcbnN1YnRyYWN0KG91dHB1dFJlc2VydmUsb3V0cHV0VmFsdWUpLFxub25lTWludXNGZWVTY2FsZWQpO1xuXG5yZXR1cm4gYWRkKGZsb29yRGl2aWRlKG51bWVyYXRvcixkZW5vbWluYXRvciksMW4pO1xuIH07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGhvdyBtYW55IGxpcXVpZGl0eSB0b2tlbnMgd2Ugc2hvdWxkIGJlIG1pbnRpbmcgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICogdXNlciB3aGVuIGFkZGluZyBsaXF1aWRpdHkuIFdlIHByb3ZpZGUgbmV3IGxpcXVpZGl0eSBlcXVhbCB0byB0aGUgZXhpc3RpbmdcbiAqIGxpcXVpZGl0eSBtdWx0aXBsaWVkIGJ5IHRoZSByYXRpbyBvZiBuZXcgY2VudHJhbCB0b2tlbnMgdG8gY2VudHJhbCB0b2tlbnNcbiAqIGFscmVhZHkgaGVsZC4gSWYgdGhlIGN1cnJlbnQgc3VwcGx5IGlzIHplcm8sIHJldHVybiB0aGUgaW5wdXRWYWx1ZSBhcyB0aGVcbiAqIGluaXRpYWwgbGlxdWlkaXR5IHRvIG1pbnQgaXMgYXJiaXRyYXJ5LlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBsaXFUb2tlblN1cHBseVxuICogQHBhcmFtIHtiaWdpbnR9IGlucHV0VmFsdWVcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFJlc2VydmVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuZ2V0T3V0cHV0UHJpY2UoZ2V0T3V0cHV0UHJpY2UpO1xuY29uc3QgICAgICAgIGNhbGNMaXFWYWx1ZVRvTWludD0oXG5saXFUb2tlblN1cHBseSxcbmlucHV0VmFsdWUsXG5pbnB1dFJlc2VydmUpPT5cbntcbmxpcVRva2VuU3VwcGx5PU5hdChsaXFUb2tlblN1cHBseSk7XG5pbnB1dFZhbHVlPU5hdChpbnB1dFZhbHVlKTtcbmlucHV0UmVzZXJ2ZT1OYXQoaW5wdXRSZXNlcnZlKTtcblxuaWYobGlxVG9rZW5TdXBwbHk9PT0wbil7XG5yZXR1cm4gaW5wdXRWYWx1ZTtcbiB9XG5yZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkoaW5wdXRWYWx1ZSxsaXFUb2tlblN1cHBseSksaW5wdXRSZXNlcnZlKTtcbiB9O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbXVjaCBvZiB0aGUgc2Vjb25kYXJ5IHRva2VuIGlzIHJlcXVpcmVkIGZyb20gdGhlIHVzZXIgd2hlblxuICogYWRkaW5nIGxpcXVpZGl0eS4gV2UgcmVxdWlyZSB0aGF0IHRoZSBkZXBvc2l0ZWQgcmF0aW8gb2YgY2VudHJhbCB0byBzZWNvbmRhcnlcbiAqIG1hdGNoIHRoZSBjdXJyZW50IHJhdGlvIG9mIGhvbGRpbmdzIGluIHRoZSBwb29sLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZW50cmFsSW4gLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgYmVpbmcgZGVwb3NpdGVkXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbFBvb2wgLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlQb29sIC0gVGhlIHZhbHVlIG9mIHNlY29uZGFyeSBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlJbiAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIHByb3ZpZGVkLiBJZlxuICogdGhlIHBvb2wgaXMgZW1wdHksIHRoZSBlbnRpcmUgYW1vdW50IHdpbGwgYmUgYWNjZXB0ZWRcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gLSB0aGUgYW1vdW50IG9mIHNlY29uZGFyeSByZXF1aXJlZFxuICovJGjigI1fb25jZS5jYWxjTGlxVmFsdWVUb01pbnQoY2FsY0xpcVZhbHVlVG9NaW50KTtcbmNvbnN0ICAgICAgICBjYWxjU2Vjb25kYXJ5UmVxdWlyZWQ9KFxuY2VudHJhbEluLFxuY2VudHJhbFBvb2wsXG5zZWNvbmRhcnlQb29sLFxuc2Vjb25kYXJ5SW4pPT5cbntcbmNlbnRyYWxJbj1OYXQoY2VudHJhbEluKTtcbmNlbnRyYWxQb29sPU5hdChjZW50cmFsUG9vbCk7XG5zZWNvbmRhcnlQb29sPU5hdChzZWNvbmRhcnlQb29sKTtcbnNlY29uZGFyeUluPU5hdChzZWNvbmRhcnlJbik7XG5cbmlmKGNlbnRyYWxQb29sPT09MG58fHNlY29uZGFyeVBvb2w9PT0wbil7XG5yZXR1cm4gc2Vjb25kYXJ5SW47XG4gfVxuXG5jb25zdCBzY2FsZWRTZWNvbmRhcnk9Zmxvb3JEaXZpZGUoXG5tdWx0aXBseShjZW50cmFsSW4sc2Vjb25kYXJ5UG9vbCksXG5jZW50cmFsUG9vbCk7XG5cbmNvbnN0IGV4YWN0PVxubXVsdGlwbHkoY2VudHJhbEluLHNlY29uZGFyeVBvb2wpPT09XG5tdWx0aXBseShzY2FsZWRTZWNvbmRhcnksY2VudHJhbFBvb2wpO1xuXG4vKiBkb2Vzbid0IG1hdGNoIHRoZSB4LXktay5wZGYgcGFwZXIsIGJ1dCBtb3JlIGNvcnJlY3QuIFdoZW4gdGhlIHJhdGlvcyBhcmUqL1xuLyogZXhhY3RseSBlcXVhbCwgbFByaW1lIGlzIGV4YWN0bHkgbCAqICgxICsgYWxwaGEpIGFuZCBhZGRpbmcgb25lIGlzIHdyb25nKi9cbnJldHVybiBleGFjdD9zY2FsZWRTZWNvbmRhcnk6MW4rc2NhbGVkU2Vjb25kYXJ5O1xuIH07XG5cbi8qIENhbGN1bGF0ZSBob3cgbWFueSB1bmRlcmx5aW5nIHRva2VucyAoaW4gdGhlIGZvcm0gb2YgYSB2YWx1ZSkgc2hvdWxkIGJlKi9cbi8qIHJldHVybmVkIHdoZW4gcmVtb3ZpbmcgbGlxdWlkaXR5LiovJGjigI1fb25jZS5jYWxjU2Vjb25kYXJ5UmVxdWlyZWQoY2FsY1NlY29uZGFyeVJlcXVpcmVkKTtcbmNvbnN0ICAgICAgICBjYWxjVmFsdWVUb1JlbW92ZT0oXG5saXFUb2tlblN1cHBseSxcbnBvb2xWYWx1ZSxcbmxpcXVpZGl0eVZhbHVlSW4pPT5cbntcbmxpcVRva2VuU3VwcGx5PU5hdChsaXFUb2tlblN1cHBseSk7XG5saXF1aWRpdHlWYWx1ZUluPU5hdChsaXF1aWRpdHlWYWx1ZUluKTtcbnBvb2xWYWx1ZT1OYXQocG9vbFZhbHVlKTtcblxucmV0dXJuIGZsb29yRGl2aWRlKG11bHRpcGx5KGxpcXVpZGl0eVZhbHVlSW4scG9vbFZhbHVlKSxsaXFUb2tlblN1cHBseSk7XG4gfTskaOKAjV9vbmNlLmNhbGNWYWx1ZVRvUmVtb3ZlKGNhbGNWYWx1ZVRvUmVtb3ZlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRJbnB1dFByaWNlIjpbImdldElucHV0UHJpY2UiXSwiZ2V0T3V0cHV0UHJpY2UiOlsiZ2V0T3V0cHV0UHJpY2UiXSwiY2FsY0xpcVZhbHVlVG9NaW50IjpbImNhbGNMaXFWYWx1ZVRvTWludCJdLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiOlsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADRDt37rEQAA6xEAADAAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9ib25kaW5nQ3VydmVzLmpzIiwiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vcHJpY2VRdW90ZS5qcyIsIi4vcmF0aW8uanMiLCIuL3NhZmVNYXRoLmpzIiwiLi9zdGF0ZU1hY2hpbmUuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3pvZUhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhZGRSYXRpb3MiLCJhc3NlcnRJc1JhdGlvIiwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJjZWlsRGl2aWRlQnkiLCJjZWlsTXVsdGlwbHlCeSIsImNoZWNrWkNGIiwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLCJkZXBvc2l0VG9TZWF0IiwiZml0UHJvcG9zYWxTaGFwZSIsImZsb29yRGl2aWRlQnkiLCJmbG9vck11bHRpcGx5QnkiLCJnZXRBbW91bnRJbiIsImdldEFtb3VudE91dCIsImdldElucHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSIsImdldFByaWNlRGVzY3JpcHRpb24iLCJnZXRUaW1lc3RhbXAiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibWFrZVN0YXRlTWFjaGluZSIsIm11bHRpcGx5UmF0aW9zIiwibmF0U2FmZU1hdGgiLCJvZmZlclRvIiwib25lTWludXMiLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6WyIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9zdGF0aXN0aWNzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9ib25kaW5nQ3VydmVzLmpzXCIsIFtbXCJnZXRJbnB1dFByaWNlXCIsIFskaOKAjV9saXZlW1wiZ2V0SW5wdXRQcmljZVwiXV1dLFtcImdldE91dHB1dFByaWNlXCIsIFskaOKAjV9saXZlW1wiZ2V0T3V0cHV0UHJpY2VcIl1dXSxbXCJjYWxjTGlxVmFsdWVUb01pbnRcIiwgWyRo4oCNX2xpdmVbXCJjYWxjTGlxVmFsdWVUb01pbnRcIl1dXSxbXCJjYWxjVmFsdWVUb1JlbW92ZVwiLCBbJGjigI1fbGl2ZVtcImNhbGNWYWx1ZVRvUmVtb3ZlXCJdXV0sW1wiY2FsY1NlY29uZGFyeVJlcXVpcmVkXCIsIFskaOKAjV9saXZlW1wiY2FsY1NlY29uZGFyeVJlcXVpcmVkXCJdXV1dXSxbXCIuL3ByaWNlQXV0aG9yaXR5LmpzXCIsIFtdXSxbXCIuL3ByaWNlUXVvdGUuanNcIiwgW1tcImdldEFtb3VudEluXCIsIFskaOKAjV9saXZlW1wiZ2V0QW1vdW50SW5cIl1dXSxbXCJnZXRBbW91bnRPdXRcIiwgWyRo4oCNX2xpdmVbXCJnZXRBbW91bnRPdXRcIl1dXSxbXCJnZXRUaW1lc3RhbXBcIiwgWyRo4oCNX2xpdmVbXCJnZXRUaW1lc3RhbXBcIl1dXSxbXCJnZXRQcmljZURlc2NyaXB0aW9uXCIsIFskaOKAjV9saXZlW1wiZ2V0UHJpY2VEZXNjcmlwdGlvblwiXV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2xpdmVbXCJuYXRTYWZlTWF0aFwiXV1dXV0sW1wiLi9zdGF0ZU1hY2hpbmUuanNcIiwgW1tcIm1ha2VTdGF0ZU1hY2hpbmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3RhdGVNYWNoaW5lXCJdXV1dXSxbXCIuL3N0YXRpc3RpY3MuanNcIiwgW11dLFtcIi4vem9lSGVscGVycy5qc1wiLCBbW1wiZGVmYXVsdEFjY2VwdGFuY2VNc2dcIiwgWyRo4oCNX2xpdmVbXCJkZWZhdWx0QWNjZXB0YW5jZU1zZ1wiXV1dLFtcInN3YXBcIiwgWyRo4oCNX2xpdmVbXCJzd2FwXCJdXV0sW1wiZml0UHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fbGl2ZVtcImZpdFByb3Bvc2FsU2hhcGVcIl1dXSxbXCJhc3NlcnRQcm9wb3NhbFNoYXBlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UHJvcG9zYWxTaGFwZVwiXV1dLFtcImFzc2VydElzc3VlcktleXdvcmRzXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0SXNzdWVyS2V5d29yZHNcIl1dXSxbXCJzYXRpc2ZpZXNcIiwgWyRo4oCNX2xpdmVbXCJzYXRpc2ZpZXNcIl1dXSxbXCJhc3NlcnROYXRBc3NldEtpbmRcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnROYXRBc3NldEtpbmRcIl1dXSxbXCJzd2FwRXhhY3RcIiwgWyRo4oCNX2xpdmVbXCJzd2FwRXhhY3RcIl1dXSxbXCJkZXBvc2l0VG9TZWF0XCIsIFskaOKAjV9saXZlW1wiZGVwb3NpdFRvU2VhdFwiXV1dLFtcIndpdGhkcmF3RnJvbVNlYXRcIiwgWyRo4oCNX2xpdmVbXCJ3aXRoZHJhd0Zyb21TZWF0XCJdXV0sW1wic2F2ZUFsbElzc3VlcnNcIiwgWyRo4oCNX2xpdmVbXCJzYXZlQWxsSXNzdWVyc1wiXV1dLFtcIm9mZmVyVG9cIiwgWyRo4oCNX2xpdmVbXCJvZmZlclRvXCJdXV0sW1wiY2hlY2taQ0ZcIiwgWyRo4oCNX2xpdmVbXCJjaGVja1pDRlwiXV1dXV0sW1wiLi9yYXRpby5qc1wiLCBbW1wibWFrZVJhdGlvXCIsIFskaOKAjV9saXZlW1wibWFrZVJhdGlvXCJdXV0sW1wibWFrZVJhdGlvRnJvbUFtb3VudHNcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUmF0aW9Gcm9tQW1vdW50c1wiXV1dLFtcImZsb29yTXVsdGlwbHlCeVwiLCBbJGjigI1fbGl2ZVtcImZsb29yTXVsdGlwbHlCeVwiXV1dLFtcImZsb29yRGl2aWRlQnlcIiwgWyRo4oCNX2xpdmVbXCJmbG9vckRpdmlkZUJ5XCJdXV0sW1wiY2VpbE11bHRpcGx5QnlcIiwgWyRo4oCNX2xpdmVbXCJjZWlsTXVsdGlwbHlCeVwiXV1dLFtcImNlaWxEaXZpZGVCeVwiLCBbJGjigI1fbGl2ZVtcImNlaWxEaXZpZGVCeVwiXV1dLFtcImFzc2VydElzUmF0aW9cIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRJc1JhdGlvXCJdXV0sW1wiaW52ZXJ0UmF0aW9cIiwgWyRo4oCNX2xpdmVbXCJpbnZlcnRSYXRpb1wiXV1dLFtcIm9uZU1pbnVzXCIsIFskaOKAjV9saXZlW1wib25lTWludXNcIl1dXSxbXCJhZGRSYXRpb3NcIiwgWyRo4oCNX2xpdmVbXCJhZGRSYXRpb3NcIl1dXSxbXCJtdWx0aXBseVJhdGlvc1wiLCBbJGjigI1fbGl2ZVtcIm11bHRpcGx5UmF0aW9zXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImdldElucHV0UHJpY2UiOlsiZ2V0SW5wdXRQcmljZSIsZmFsc2VdLCJnZXRPdXRwdXRQcmljZSI6WyJnZXRPdXRwdXRQcmljZSIsZmFsc2VdLCJjYWxjTGlxVmFsdWVUb01pbnQiOlsiY2FsY0xpcVZhbHVlVG9NaW50IixmYWxzZV0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIixmYWxzZV0sImNhbGNTZWNvbmRhcnlSZXF1aXJlZCI6WyJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLGZhbHNlXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iLGZhbHNlXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCIsZmFsc2VdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIixmYWxzZV0sImdldFByaWNlRGVzY3JpcHRpb24iOlsiZ2V0UHJpY2VEZXNjcmlwdGlvbiIsZmFsc2VdLCJuYXRTYWZlTWF0aCI6WyJuYXRTYWZlTWF0aCIsZmFsc2VdLCJtYWtlU3RhdGVNYWNoaW5lIjpbIm1ha2VTdGF0ZU1hY2hpbmUiLGZhbHNlXSwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLGZhbHNlXSwic3dhcCI6WyJzd2FwIixmYWxzZV0sImZpdFByb3Bvc2FsU2hhcGUiOlsiZml0UHJvcG9zYWxTaGFwZSIsZmFsc2VdLCJhc3NlcnRQcm9wb3NhbFNoYXBlIjpbImFzc2VydFByb3Bvc2FsU2hhcGUiLGZhbHNlXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLGZhbHNlXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyIsZmFsc2VdLCJhc3NlcnROYXRBc3NldEtpbmQiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIixmYWxzZV0sInN3YXBFeGFjdCI6WyJzd2FwRXhhY3QiLGZhbHNlXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0IixmYWxzZV0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCIsZmFsc2VdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyIsZmFsc2VdLCJvZmZlclRvIjpbIm9mZmVyVG8iLGZhbHNlXSwiY2hlY2taQ0YiOlsiY2hlY2taQ0YiLGZhbHNlXSwibWFrZVJhdGlvIjpbIm1ha2VSYXRpbyIsZmFsc2VdLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyI6WyJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsZmFsc2VdLCJmbG9vck11bHRpcGx5QnkiOlsiZmxvb3JNdWx0aXBseUJ5IixmYWxzZV0sImZsb29yRGl2aWRlQnkiOlsiZmxvb3JEaXZpZGVCeSIsZmFsc2VdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSIsZmFsc2VdLCJjZWlsRGl2aWRlQnkiOlsiY2VpbERpdmlkZUJ5IixmYWxzZV0sImFzc2VydElzUmF0aW8iOlsiYXNzZXJ0SXNSYXRpbyIsZmFsc2VdLCJpbnZlcnRSYXRpbyI6WyJpbnZlcnRSYXRpbyIsZmFsc2VdLCJvbmVNaW51cyI6WyJvbmVNaW51cyIsZmFsc2VdLCJhZGRSYXRpb3MiOlsiYWRkUmF0aW9zIixmYWxzZV0sIm11bHRpcGx5UmF0aW9zIjpbIm11bHRpcGx5UmF0aW9zIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIOhdNVVJQAAVSUAADkAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixhc3NlcnQsWCxtYWtlUHJvbWlzZUtpdCxBbW91bnRNYXRoLG1ha2VOb3RpZmllcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VOb3RpZmllciA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdFwifSk7JGjigI1fb25jZS5tYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBjYWxsYmFjayBDb21wYXJlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50TGltaXRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzTFQ9KGFtb3VudCxhbW91bnRMaW1pdCk9PiFBbW91bnRNYXRoLmlzR1RFKGFtb3VudCxhbW91bnRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzTFRFPShhbW91bnQsYW1vdW50TGltaXQpPT5BbW91bnRNYXRoLmlzR1RFKGFtb3VudExpbWl0LGFtb3VudCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzR1RFPShhbW91bnQsYW1vdW50TGltaXQpPT5BbW91bnRNYXRoLmlzR1RFKGFtb3VudCxhbW91bnRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzR1Q9KGFtb3VudCxhbW91bnRMaW1pdCk9PiFBbW91bnRNYXRoLmlzR1RFKGFtb3VudExpbWl0LGFtb3VudCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIFRyaWdnZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gY3JlYXRlSW5zdGFudFF1b3RlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0lzc3Vlcjwnc2V0Jz59IG9wdHMucXVvdGVJc3N1ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjx1bmtub3duPj59IG9wdHMubm90aWZpZXJcbiAqIEBwYXJhbSB7RVJlZjxUaW1lclNlcnZpY2U+fSBvcHRzLnRpbWVyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IG9wdHMuY3JlYXRlUXVvdGVcbiAqIEBwYXJhbSB7QnJhbmR9IG9wdHMuYWN0dWFsQnJhbmRJblxuICogQHBhcmFtIHtCcmFuZH0gb3B0cy5hY3R1YWxCcmFuZE91dFxuICogQHJldHVybnMge1ByaWNlQXV0aG9yaXR5S2l0fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KG9wdHMpe1xuY29uc3R7XG50aW1lcixcbmNyZWF0ZVF1b3RlLFxuYWN0dWFsQnJhbmRJbixcbmFjdHVhbEJyYW5kT3V0LFxucXVvdGVJc3N1ZXIsXG5ub3RpZmllcn09XG5vcHRzO1xuXG5sZXQgaGF2ZUZpcnN0UXVvdGU9ZmFsc2U7XG5cbkUobm90aWZpZXIpLlxuZ2V0VXBkYXRlU2luY2UoKS5cbnRoZW4oKF8pPT5oYXZlRmlyc3RRdW90ZT10cnVlKTtcblxuLyoqIEB0eXBlIHtTZXQ8VHJpZ2dlcj59ICovXG5jb25zdCB0cmlnZ2Vycz1uZXcgU2V0KCk7XG5jb25zdCBtdXRhYmxlVHJpZ2dlcnM9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gdHJpZ2dlckNyZWF0ZVF1b3RlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgZmlyZVRyaWdnZXJzPWFzeW5jKHRyaWdnZXJDcmVhdGVRdW90ZSk9PntcbmlmKCFoYXZlRmlyc3RRdW90ZSl7XG5yZXR1cm47XG4gfVxuYXdhaXQgUHJvbWlzZS5hbGwoXG5bLi4udHJpZ2dlcnMsLi4uQXJyYXkuZnJvbShtdXRhYmxlVHJpZ2dlcnMudmFsdWVzKCkpXS5tYXAoKHRyaWdnZXIpPT5cbnRyaWdnZXIodHJpZ2dlckNyZWF0ZVF1b3RlKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIHF1b3RlV2hlbiogZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtDb21wYXJlQW1vdW50fSBjb21wYXJlQW1vdW50c0ZuXG4gKi9cbmNvbnN0IG1ha2VRdW90ZVdoZW5PdXQ9KGNvbXBhcmVBbW91bnRzRm4pPT5cbi8qKlxuICogUmV0dXJuIGEgcXVvdGUgd2hlbiB0cmlnZ2VyV2hlbiBpcyB0cnVlIG9mIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudEluIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUgY2FsY0Ftb3VudFRyaWdnZXJcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRPdXRMaW1pdCB0aGUgdmFsdWUgdG8gY29tcGFyZSB3aXRoIHRoZSBvdXRwdXRcbiAqIG9mIGNhbGNBbW91bnRUcmlnZ2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHF1b3RlV2hlbk91dFRyaWdnZXIoYW1vdW50SW4sYW1vdW50T3V0TGltaXQpe1xuYW1vdW50SW49QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hbW91bnRPdXRMaW1pdD1BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHRyaWdnZXJQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG4vKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuY29uc3QgdHJpZ2dlcj1hc3luYyhjcmVhdGVJbnN0YW50UXVvdGUpPT57XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlSW5zdGFudFF1b3RlKChjYWxjQW1vdW50T3V0KT0+e1xuaWYoIXRyaWdnZXJzLmhhcyh0cmlnZ2VyKSl7XG4vKiBBbHJlYWR5IGZpcmVkLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IGFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuaWYoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LGFtb3VudE91dExpbWl0KSl7XG4vKiBEb24ndCBmaXJlIHRoZSB0cmlnZ2VyIHlldC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5cbmlmKCFxdW90ZVApe1xuLyogV2Ugc2hvdWxkbid0IHJlc29sdmUgeWV0LiovXG5yZXR1cm47XG4gfVxuXG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG50cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuIH1jYXRjaChlKXtcbi8qIFRyaWdnZXIgZmFpbGVkLCBzbyByZWplY3QgYW5kIGRyb3AuKi9cbnRyaWdnZXJQSy5yZWplY3QoZSk7XG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG4gfVxuIH07XG5cbnRyaWdnZXJzLmFkZCh0cmlnZ2VyKTtcblxuLyogRmlyZSBub3csIGp1c3QgaW4gY2FzZS4qL1xuYXdhaXQgdHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbnJldHVybiB0cmlnZ2VyUEsucHJvbWlzZTtcbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIG11dGFibGVRdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG5jb25zdCBtYWtlTXV0YWJsZVF1b3RlPShjb21wYXJlQW1vdW50c0ZuKT0+XG4vKipcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRJblxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudE91dExpbWl0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG11dGFibGVRdW90ZVdoZW5PdXRUcmlnZ2VyKGFtb3VudEluLGFtb3VudE91dExpbWl0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsYW1vdW50T3V0TGltaXQpO1xuXG4vKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG5jb25zdCB0cmlnZ2VyUEs9bWFrZVByb21pc2VLaXQoKTtcblxuLyoqIEB0eXBlIHtNdXRhYmxlUXVvdGV9ICovXG5jb25zdCBtdXRhYmxlUXVvdGU9RmFyKCdNdXRhYmxlUXVvdGUnLHtcbmNhbmNlbDooZSk9PnRyaWdnZXJQSy5yZWplY3QoZSksXG51cGRhdGVMZXZlbDoobmV3QW1vdW50SW4sbmV3QW1vdW50T3V0TGltaXQpPT57XG5jb25zdCBjb2VyY2VkQW1vdW50SW49QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixuZXdBbW91bnRJbik7XG5jb25zdCBjb2VyY2VkQW1vdW50T3V0TGltaXQ9QW1vdW50TWF0aC5jb2VyY2UoXG5hY3R1YWxCcmFuZE91dCxcbm5ld0Ftb3VudE91dExpbWl0KTtcblxuYW1vdW50SW49Y29lcmNlZEFtb3VudEluO1xuYW1vdW50T3V0TGltaXQ9Y29lcmNlZEFtb3VudE91dExpbWl0O1xuZmlyZVRyaWdnZXJzKGNyZWF0ZVF1b3RlKTtcbiB9LFxuZ2V0UHJvbWlzZTooKT0+dHJpZ2dlclBLLnByb21pc2V9KTtcblxuXG4vKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuY29uc3QgbXV0YWJsZVRyaWdnZXI9YXN5bmMoY3JlYXRlSW5zdGFudFF1b3RlKT0+e1xudHJ5e1xuY29uc3QgcXVvdGVQPWNyZWF0ZUluc3RhbnRRdW90ZSgoY2FsY0Ftb3VudE91dCk9PntcbmlmKCFtdXRhYmxlVHJpZ2dlcnMuaGFzKG11dGFibGVRdW90ZSkpe1xuLyogQWxyZWFkeSBmaXJlZC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBhbW91bnRPdXQ9Y2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbmlmKCFjb21wYXJlQW1vdW50c0ZuKGFtb3VudE91dCxhbW91bnRPdXRMaW1pdCkpe1xuLyogRG9uJ3QgZmlyZSB0aGUgbXV0YWJsZVRyaWdnZXIgeWV0LiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuLyogR2VuZXJhdGUgdGhlIHF1b3RlLiovXG5yZXR1cm57YW1vdW50SW4sYW1vdW50T3V0fTtcbiB9KTtcblxuaWYoIXF1b3RlUCl7XG4vKiBXZSBzaG91bGRuJ3QgcmVzb2x2ZSB5ZXQuKi9cbnJldHVybjtcbiB9XG5cbm11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbnRyaWdnZXJQSy5yZXNvbHZlKHF1b3RlUCk7XG4gfWNhdGNoKGUpe1xuLyogVHJpZ2dlciBmYWlsZWQsIHNvIHJlamVjdCBhbmQgZHJvcC4qL1xudHJpZ2dlclBLLnJlamVjdChlKTtcbm11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbiB9XG4gfTtcblxubXV0YWJsZVRyaWdnZXJzLnNldChtdXRhYmxlUXVvdGUsbXV0YWJsZVRyaWdnZXIpO1xuXG4vKiBGaXJlIG5vdywganVzdCBpbiBjYXNlLiovXG5hd2FpdCBtdXRhYmxlVHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbnJldHVybiBtdXRhYmxlUXVvdGU7XG4gfTtcblxuLyoqXG4gKiBFbnN1cmUgdGhhdCB0aGUgYnJhbmRJbi9icmFuZE91dCBwYWlyIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZEluXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZE91dFxuICovXG5jb25zdCBhc3NlcnRCcmFuZHM9KGJyYW5kSW4sYnJhbmRPdXQpPT57XG5hc3NlcnQuZXF1YWwoXG5icmFuZEluLFxuYWN0dWFsQnJhbmRJbixcblggYERlc2lyZWQgYnJhbmRJbiAke2JyYW5kSW59IG11c3QgbWF0Y2ggJHthY3R1YWxCcmFuZElufWApO1xuXG5hc3NlcnQuZXF1YWwoXG5icmFuZE91dCxcbmFjdHVhbEJyYW5kT3V0LFxuWCBgRGVzaXJlZCBicmFuZE91dCAke2JyYW5kT3V0fSBtdXN0IG1hdGNoICR7YWN0dWFsQnJhbmRPdXR9YCk7XG5cbiB9O1xuXG4vKiogQHR5cGUge1ByaWNlQXV0aG9yaXR5fSAqL1xuY29uc3QgcHJpY2VBdXRob3JpdHk9RmFyKCdQcmljZUF1dGhvcml0eScse1xuZ2V0UXVvdGVJc3N1ZXIoYnJhbmRJbixicmFuZE91dCl7XG5hc3NlcnRCcmFuZHMoYnJhbmRJbixicmFuZE91dCk7XG5yZXR1cm4gcXVvdGVJc3N1ZXI7XG4gfSxcbmdldFRpbWVyU2VydmljZShicmFuZEluLGJyYW5kT3V0KXtcbmFzc2VydEJyYW5kcyhicmFuZEluLGJyYW5kT3V0KTtcbnJldHVybiB0aW1lcjtcbiB9LFxubWFrZVF1b3RlTm90aWZpZXIoYW1vdW50SW4sYnJhbmRPdXQpe1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsYnJhbmRPdXQpO1xuXG4vKiBXcmFwIG91ciB1bmRlcmx5aW5nIG5vdGlmaWVyIHdpdGggc3BlY2lmaWMgcXVvdGVzLiovXG5jb25zdCBzcGVjaWZpY0Jhc2VOb3RpZmllcj1oYXJkZW4oe1xuICAgICAgYXN5bmMgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9dW5kZWZpbmVkKXtcbi8qIFdlIHVzZSB0aGUgc2FtZSB1cGRhdGVDb3VudCBhcyBvdXIgdW5kZXJseWluZyBub3RpZmllci4qL1xuY29uc3QgcmVjb3JkPWF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcblxuLyogV2UgY3JlYXRlIGEgcXVvdGUgaW5saW5lLiovXG5jb25zdCBxdW90ZT1jcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCk9Pih7XG5hbW91bnRJbixcbmFtb3VudE91dDpjYWxjQW1vdW50T3V0KGFtb3VudEluKX0pKTtcblxuYXNzZXJ0KHF1b3RlKTtcblxuY29uc3QgdmFsdWU9YXdhaXQgcXVvdGU7XG5yZXR1cm4gaGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6cmVjb3JkLnVwZGF0ZUNvdW50fSk7XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHNwZWNpZmljTm90aWZpZXI9RmFyKCdRdW90ZU5vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoc3BlY2lmaWNCYXNlTm90aWZpZXIpLFxuLyogVE9ETyBzdG9wIGV4cG9zaW5nIGJhc2VOb3RpZmllciBtZXRob2RzIGRpcmVjdGx5LiovXG4uLi5zcGVjaWZpY0Jhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gc3BlY2lmaWNOb3RpZmllcjtcbiB9LFxuICAgICAgYXN5bmMgcXVvdGVHaXZlbihhbW91bnRJbixicmFuZE91dCl7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLGFtb3VudEluKTtcbmFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCxicmFuZE91dCk7XG5cbmF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG5jb25zdCBxdW90ZT1jcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCk9Pih7XG5hbW91bnRJbixcbmFtb3VudE91dDpjYWxjQW1vdW50T3V0KGFtb3VudEluKX0pKTtcblxuYXNzZXJ0KHF1b3RlKTtcbnJldHVybiBxdW90ZTtcbiB9LFxuICAgICAgYXN5bmMgcXVvdGVXYW50ZWQoYnJhbmRJbixhbW91bnRPdXQpe1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsYW1vdW50T3V0KTtcbmFzc2VydEJyYW5kcyhicmFuZEluLGFtb3VudE91dC5icmFuZCk7XG5cbmF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG5jb25zdCBxdW90ZT1jcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCxjYWxjQW1vdW50SW4pPT57XG4vKiBXZSBuZWVkIHRvIGRldGVybWluZSBhbiBhbW91bnRJbiB0aGF0IGd1YXJhbnRlZXMgYXQgbGVhc3QgdGhlIGFtb3VudE91dC4qL1xuY29uc3QgYW1vdW50SW49Y2FsY0Ftb3VudEluKGFtb3VudE91dCk7XG5jb25zdCBhY3R1YWxBbW91bnRPdXQ9Y2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5BbW91bnRNYXRoLmlzR1RFKGFjdHVhbEFtb3VudE91dCxhbW91bnRPdXQpfHxcbmFzc2VydC5mYWlsKFxuWCBgQ2FsY3VsYXRpb24gb2YgJHthY3R1YWxBbW91bnRPdXR9IGRpZG4ndCBjb3ZlciBleHBlY3RlZCAke2Ftb3VudE91dH1gKTtcblxucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5hc3NlcnQocXVvdGUpO1xucmV0dXJuIHF1b3RlO1xuIH0sXG4gICAgICBhc3luYyBxdW90ZUF0VGltZShkZWFkbGluZSxhbW91bnRJbixicmFuZE91dCl7XG5hc3NlcnQudHlwZW9mKGRlYWRsaW5lLCdiaWdpbnQnKTtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlUEs9bWFrZVByb21pc2VLaXQoKTtcbmF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbmRlYWRsaW5lLFxuRmFyKCd3YWtlT2JqJyx7XG4gICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCl7XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbiksXG50aW1lc3RhbXB9KSk7XG5cblxuLyogV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHF1b3RlIHRvIGJlIGF1dGhlbnRpY2F0ZWQ7IHJlc29sdmUqL1xuLyogaW1tZWRpYXRlbHkuKi9cbnF1b3RlUEsucmVzb2x2ZShxdW90ZVApO1xuYXdhaXQgcXVvdGVQSy5wcm9taXNlO1xuIH1jYXRjaChlKXtcbnF1b3RlUEsucmVqZWN0KGUpO1xuIH1cbiB9fSkpO1xuXG5cblxuLyogV2FpdCB1bnRpbCB0aGUgd2FrZXVwIHBhc3Nlcy4qL1xucmV0dXJuIHF1b3RlUEsucHJvbWlzZTtcbiB9LFxucXVvdGVXaGVuTFQ6bWFrZVF1b3RlV2hlbk91dChpc0xUKSxcbnF1b3RlV2hlbkxURTptYWtlUXVvdGVXaGVuT3V0KGlzTFRFKSxcbnF1b3RlV2hlbkdURTptYWtlUXVvdGVXaGVuT3V0KGlzR1RFKSxcbnF1b3RlV2hlbkdUOm1ha2VRdW90ZVdoZW5PdXQoaXNHVCksXG5tdXRhYmxlUXVvdGVXaGVuTFQ6bWFrZU11dGFibGVRdW90ZShpc0xUKSxcbm11dGFibGVRdW90ZVdoZW5MVEU6bWFrZU11dGFibGVRdW90ZShpc0xURSksXG5tdXRhYmxlUXVvdGVXaGVuR1Q6bWFrZU11dGFibGVRdW90ZShpc0dUKSxcbm11dGFibGVRdW90ZVdoZW5HVEU6bWFrZU11dGFibGVRdW90ZShpc0dURSl9KTtcblxuXG5yZXR1cm57cHJpY2VBdXRob3JpdHksYWRtaW5GYWNldDp7ZmlyZVRyaWdnZXJzfX07XG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCI6WyJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5F0tCqwIAACsCAAANQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbmF0IiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImdldEFtb3VudEluIiwiZ2V0QW1vdW50T3V0IiwiZ2V0UHJpY2VEZXNjcmlwdGlvbiIsImdldFRpbWVzdGFtcCIsInVuaXRBbW91bnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxOYXQsRTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qIFByaWNlQXV0aG9yaXRpZXMgcmV0dXJuIHF1b3RlcyBhcyBhIHBhaXIgb2YgYW4gYW1vdW50IGFuZCBhIHBheW1lbnQsIGJvdGgqL1xuLyogd2l0aCB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuZGVybHlpbmcgYW1vdW50IHdyYXBzIGFtb3VudEluLCBhbW91bnRPdXQsIHRpbWVyKi9cbi8qIGFuZCB0aW1lc3RhbXAuIFRoZSBwYXltZW50IGlzIGlzc3VlZCBieSB0aGUgcXVvdGVJc3N1ZXIgdG8gc3VwcG9ydCB2ZXJhY2l0eSovXG4vKiBjaGVja2luZy4gVGhlc2UgaGVscGVycyBtYWtlIGl0IGVhc2llciB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzIG9mIHRoZSBRdW90ZSovXG5cbi8qKlxuICogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZVxuICogQHJldHVybnMge1ByaWNlRGVzY3JpcHRpb259XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQcmljZURlc2NyaXB0aW9uPShxdW90ZSk9PntcbmFzc2VydChcbnF1b3RlLnF1b3RlQW1vdW50LnZhbHVlLmxlbmd0aD09PTEsXG4ncXVvdGVBbW91bnQgc2V0IG11c3QgaGF2ZSBvbmUgbWVtYmVyJyk7XG5cbnJldHVybiBxdW90ZS5xdW90ZUFtb3VudC52YWx1ZVswXTtcbiB9O1xuXG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRo4oCNX29uY2UuZ2V0UHJpY2VEZXNjcmlwdGlvbihnZXRQcmljZURlc2NyaXB0aW9uKTtcbmNvbnN0ICAgICAgICBnZXRBbW91bnRJbj0ocXVvdGUpPT5nZXRQcmljZURlc2NyaXB0aW9uKHF1b3RlKS5hbW91bnRJbjtcbi8qKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlICovJGjigI1fb25jZS5nZXRBbW91bnRJbihnZXRBbW91bnRJbik7XG5jb25zdCAgICAgICAgZ2V0QW1vdW50T3V0PShxdW90ZSk9PmdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudE91dDtcbi8qKiBAdHlwZSB7KHF1b3RlOiBQcmljZVF1b3RlKSA9PiBUaW1lc3RhbXB9ICovJGjigI1fb25jZS5nZXRBbW91bnRPdXQoZ2V0QW1vdW50T3V0KTtcbmNvbnN0ICAgICAgICBnZXRUaW1lc3RhbXA9KHF1b3RlKT0+Z2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkudGltZXN0YW1wO1xuXG4vKiogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGJyYW5kICovJGjigI1fb25jZS5nZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKTtcbmNvbnN0ICAgICAgICB1bml0QW1vdW50PWFzeW5jKGJyYW5kKT0+e1xuLyogQnJhbmQgbWV0aG9kcyBhcmUgcmVtb3RlKi9cbmNvbnN0IGRpc3BsYXlJbmZvPWF3YWl0IEUoYnJhbmQpLmdldERpc3BsYXlJbmZvKCk7XG5jb25zdCBkZWNpbWFsUGxhY2VzPWRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXM/PzA7XG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLDEwbioqTmF0KGRlY2ltYWxQbGFjZXMpKTtcbiB9OyRo4oCNX29uY2UudW5pdEFtb3VudCh1bml0QW1vdW50KTtcbmhhcmRlbih1bml0QW1vdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCJdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIl0sInVuaXRBbW91bnQiOlsidW5pdEFtb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACFbRi1FDYAABQ2AAAwAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzeyJpbXBvcnRzIjpbIi4vc2FmZU1hdGguanMiLCIuL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL25hdCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhZGRSYXRpb3MiLCJhc3NlcnRJc1JhdGlvIiwiYXNzZXJ0UGFyc2FibGVOdW1iZXIiLCJjZWlsRGl2aWRlQnkiLCJjZWlsTXVsdGlwbHlCeSIsImRpdmlkZUJ5IiwiZmxvb3JEaXZpZGVCeSIsImZsb29yTXVsdGlwbHlCeSIsImludmVydFJhdGlvIiwibWFrZVJhdGlvIiwibWFrZVJhdGlvRnJvbUFtb3VudHMiLCJtdWx0aXBseUJ5IiwibXVsdGlwbHlSYXRpb3MiLCJvbmVNaW51cyIsInBhcnNlUmF0aW8iLCJxdWFudGl6ZSIsInJhdGlvR1RFIiwicmF0aW9zU2FtZSIsInN1YnRyYWN0UmF0aW9zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxYLHEsQW1vdW50TWF0aCxhc3NlcnRSZWNvcmQsaXNOYXQsbmF0U2FmZU1hdGg7JGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJkZXRhaWxzXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25hdFwiLCBbW1wiaXNOYXRcIiwgWyRo4oCNX2EgPT4gKGlzTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vc2FmZU1hdGguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsIFskaOKAjV9hID0+IChuYXRTYWZlTWF0aCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHttdWx0aXBseSxmbG9vckRpdmlkZSxjZWlsRGl2aWRlLGJhbmtlcnNEaXZpZGUsYWRkLHN1YnRyYWN0fT1cbm5hdFNhZmVNYXRoO1xuXG4vKiBtYWtlIGEgUmF0aW8sIHdoaWNoIHJlcHJlc2VudHMgYSBmcmFjdGlvbi4gSXQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLiovXG4vKiovXG4vKiBUaGUgbmF0dXJhbCBzeW50YXggZm9yIHRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb25zIHdlIHdhbnQgdG8gc3VwcG9ydCovXG4vKiBhcmUgQW1vdW50ICogUmF0aW8gYW5kIEFtb3VudCAvIFJhdGlvLiBTaW5jZSB0aGUgb3BlcmF0aW9ucyB3YW50IHRvIGFkaGVyZSB0byovXG4vKiB0aGUgcmF0aW8gcmF0aGVyIHRoYW4gdGhlIGFtb3VudCwgd2Ugc2V0dGxlZCBvbiBhIGNhbGxpbmcgY29udmVudGlvbiBvZiovXG4vKiBbY2VpbHxmbG9vcl1NdWx0aXBseUJ5KEFtb3VudCwgUmF0aW8pIGFuZCBbY2VpbHxmbG9vcl1EaXZpZGVCeShBbW91bnQsIFJhdGlvKSovXG4vKiovXG4vKiBUaGUgbW9zdCBjb21tb24ga2luZCBvZiBSYXRpbyBjYW4gYmUgYXBwbGllZCB0byBBbW91bnRzIG9mIGEgcGFydGljdWxhciovXG4vKiBicmFuZCwgYW5kIHByb2R1Y2VzIHJlc3VsdHMgb2YgdGhlIHNhbWUgYnJhbmQuIFRoaXMgcmVwcmVzZW50cyBhIG11bHRpcGxpZXIqL1xuLyogdGhhdCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhhdCBicmFuZC4gVGhlIGxlc3MgY29tbW9uIGtpbmQgb2YgUmF0aW8gY2FuIGJlKi9cbi8qIGFwcGxpZWQgdG8gb25lIHBhcnRpY3VsYXIgYnJhbmQgb2YgYW1vdW50cywgYW5kIHByb2R1Y2VzIHJlc3VsdHMgb2YgYW5vdGhlciovXG4vKiBwYXJ0aWN1bGFyIGJyYW5kLiBUaGlzIHJlcHJlc2VudHMgc29tZSBraW5kIG9mIGV4Y2hhbmdlIHJhdGUuIFRoZSovXG4vKiBicmFuZC1jaGVja2luZyBoZWxwcyB1cyBlbnN1cmUgdGhhdCBub3JtYWwgUmF0aW9zIGFyZW4ndCBhcHBsaWVkIHRvIGFtb3VudHMqL1xuLyogb2YgdGhlIHdyb25nIGJyYW5kLCBhbmQgdGhhdCBleGNoYW5nZSByYXRlcyBhcmUgb25seSB1c2VkIGluIHRoZSBhcHByb3ByaWF0ZSovXG4vKiBkaXJlY3Rpb24uKi9cbi8qKi9cbi8qIFNpbmNlIHRoZSByYXRpb3MgYXJlIHJlcHJlc2VudGVkIGJ5IGEgbnVtZXJhdG9yIGFuZCBhIGRlbm9taW5hdG9yLCBldmVyeSovXG4vKiBtdWx0aXBsaWNhdGlvbiBvciBkaXZpc2lvbiBvcGVyYXRpb24gdGhhdCBwcm9kdWNlcyBhbiBhbW91bnQgZW5kcyB3aXRoIGEqL1xuLyogZGl2aXNpb24gb2YgdGhlIHVuZGVybHlpbmcgYmlnaW50cywgYW5kIGludGVnZXIgZGl2aXNpb24gcmVxdWlyZXMgYSBtb2RlKi9cbi8qIG9mIFtyb3VuZGluZyB0byBpbnRlZ2VyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3VuZGluZyNSb3VuZGluZ190b19pbnRlZ2VyKS4qL1xuLyogQmVjYXVzZSBgUmF0aW9gIG9ubHkgd29yayB3aXRoIE5hdHVyYWwgbnVtYmVycywganVzdCB0aHJlZSBtb2RlcyBzdWZmaWNlOiovXG4vKiAtIGZsb29yIHJvdW5kcyBkb3duKi9cbi8qIC0gY2VpbCByb3VuZHMgdXAqL1xuLyogLSBkZWZhdWx0ICh3aXRob3V0IHByZWZpeCkgbWluaW1pemVzIGJpYXMgYnkgcm91bmRpbmcgaGFsZiB0byBldmVuKi9cblxuY29uc3QgUEVSQ0VOVD0xMDBuO1xuXG5jb25zdCByYXRpb1Byb3BlcnR5TmFtZXM9WydudW1lcmF0b3InLCdkZW5vbWluYXRvciddO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0SXNSYXRpbz0ocmF0aW8pPT57XG5hc3NlcnRSZWNvcmQocmF0aW8sJ3JhdGlvJyk7XG5jb25zdCBrZXlzPU9iamVjdC5rZXlzKHJhdGlvKTtcbmFzc2VydChrZXlzLmxlbmd0aD09PTIsWCBgUmF0aW8gJHtyYXRpb30gbXVzdCBiZSBhIHJlY29yZCB3aXRoIDIgZmllbGRzLmApO1xuZm9yKGNvbnN0IG5hbWUgb2Yga2V5cyl7XG5yYXRpb1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMobmFtZSl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBQYXJhbWV0ZXIgbXVzdCBiZSBhIFJhdGlvIHJlY29yZCwgYnV0ICR7cmF0aW99IGhhcyAke3EobmFtZSl9YCk7XG5cbiB9XG5jb25zdCBudW1lcmF0b3JWYWx1ZT1yYXRpby5udW1lcmF0b3IudmFsdWU7XG5jb25zdCBkZW5vbWluYXRvclZhbHVlPXJhdGlvLmRlbm9taW5hdG9yLnZhbHVlO1xuaXNOYXQobnVtZXJhdG9yVmFsdWUpfHxcbmFzc2VydC5mYWlsKFxuWCBgVGhlIG51bWVyYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke251bWVyYXRvclZhbHVlfWApO1xuXG5pc05hdChkZW5vbWluYXRvclZhbHVlKXx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBkZW5vbWluYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke2Rlbm9taW5hdG9yVmFsdWV9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7YmlnaW50fSBudW1lcmF0b3JcbiAqIEBwYXJhbSB7QnJhbmR9IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge2JpZ2ludD19IGRlbm9taW5hdG9yIFRoZSBkZWZhdWx0IGRlbm9taW5hdG9yIGlzIDEwMFxuICogQHBhcmFtIHtCcmFuZD19IGRlbm9taW5hdG9yQnJhbmQgVGhlIGRlZmF1bHQgaXMgdG8gcmV1c2UgdGhlIG51bWVyYXRvckJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFzc2VydElzUmF0aW8oYXNzZXJ0SXNSYXRpbyk7XG5jb25zdCAgICAgICAgbWFrZVJhdGlvPShcbm51bWVyYXRvcixcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3I9UEVSQ0VOVCxcbmRlbm9taW5hdG9yQnJhbmQ9bnVtZXJhdG9yQnJhbmQpPT5cbntcbmRlbm9taW5hdG9yPjBufHxcbmFzc2VydC5mYWlsKFxuWCBgTm8gaW5maW5pdGUgcmF0aW9zISBEZW5vbWluYXRvciB3YXMgMC8ke3EoZGVub21pbmF0b3JCcmFuZCl9YCk7XG5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IHRvIHJldHVybiB0eXBlIGJlY2F1c2UgbWFrZSgpIGVuc3VyZXMqL1xucmV0dXJuIGhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50TWF0aC5tYWtlKG51bWVyYXRvckJyYW5kLG51bWVyYXRvciksXG5kZW5vbWluYXRvcjpBbW91bnRNYXRoLm1ha2UoZGVub21pbmF0b3JCcmFuZCxkZW5vbWluYXRvcil9KTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnR9IG51bWVyYXRvckFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGRlbm9taW5hdG9yQW1vdW50XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLm1ha2VSYXRpbyhtYWtlUmF0aW8pO1xuY29uc3QgICAgICAgIG1ha2VSYXRpb0Zyb21BbW91bnRzPShudW1lcmF0b3JBbW91bnQsZGVub21pbmF0b3JBbW91bnQpPT57XG5BbW91bnRNYXRoLmNvZXJjZShudW1lcmF0b3JBbW91bnQuYnJhbmQsbnVtZXJhdG9yQW1vdW50KTtcbkFtb3VudE1hdGguY29lcmNlKGRlbm9taW5hdG9yQW1vdW50LmJyYW5kLGRlbm9taW5hdG9yQW1vdW50KTtcbnJldHVybiBtYWtlUmF0aW8oXG4vKiBAdHMtZXhwZWN0LWVycm9yIHZhbHVlIGNhbiBiZSBhbnkgQW1vdW50VmFsdWUgYnV0IG1ha2VSYXRpbygpIHN1cHBvcnRzIG9ubHkgYmlnaW50Ki9cbm51bWVyYXRvckFtb3VudC52YWx1ZSxcbm51bWVyYXRvckFtb3VudC5icmFuZCxcbmRlbm9taW5hdG9yQW1vdW50LnZhbHVlLFxuZGVub21pbmF0b3JBbW91bnQuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7Kn0gZGl2aWRlT3BcbiAqLyRo4oCNX29uY2UubWFrZVJhdGlvRnJvbUFtb3VudHMobWFrZVJhdGlvRnJvbUFtb3VudHMpO1xuY29uc3QgbXVsdGlwbHlIZWxwZXI9KGFtb3VudCxyYXRpbyxkaXZpZGVPcCk9PntcbkFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCxhbW91bnQpO1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5hc3NlcnQoXG5hbW91bnQuYnJhbmQ9PT1yYXRpby5kZW5vbWluYXRvci5icmFuZCxcblggYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgZGVub21pbmF0b3IgJHtxKFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQpXG4gfWApO1xuXG5cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoXG5yYXRpby5udW1lcmF0b3IuYnJhbmQsXG5kaXZpZGVPcChcbm11bHRpcGx5KGFtb3VudC52YWx1ZSxyYXRpby5udW1lcmF0b3IudmFsdWUpLFxucmF0aW8uZGVub21pbmF0b3IudmFsdWUpKTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi9cbmNvbnN0ICAgICAgICBmbG9vck11bHRpcGx5Qnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQscmF0aW8sZmxvb3JEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5mbG9vck11bHRpcGx5QnkoZmxvb3JNdWx0aXBseUJ5KTtcbmNvbnN0ICAgICAgICBjZWlsTXVsdGlwbHlCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCxyYXRpbyxjZWlsRGl2aWRlKTtcbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRo4oCNX29uY2UuY2VpbE11bHRpcGx5QnkoY2VpbE11bHRpcGx5QnkpO1xuY29uc3QgICAgICAgIG11bHRpcGx5Qnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQscmF0aW8sYmFua2Vyc0RpdmlkZSk7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7Kn0gZGl2aWRlT3BcbiAqLyRo4oCNX29uY2UubXVsdGlwbHlCeShtdWx0aXBseUJ5KTtcbmNvbnN0IGRpdmlkZUhlbHBlcj0oYW1vdW50LHJhdGlvLGRpdmlkZU9wKT0+e1xuQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLGFtb3VudCk7XG5hc3NlcnRJc1JhdGlvKHJhdGlvKTtcbmFzc2VydChcbmFtb3VudC5icmFuZD09PXJhdGlvLm51bWVyYXRvci5icmFuZCxcblggYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgbnVtZXJhdG9yICR7cShcbnJhdGlvLm51bWVyYXRvci5icmFuZClcbiB9YCk7XG5cblxucmV0dXJuIEFtb3VudE1hdGgubWFrZShcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuZGl2aWRlT3AoXG5tdWx0aXBseShhbW91bnQudmFsdWUscmF0aW8uZGVub21pbmF0b3IudmFsdWUpLFxucmF0aW8ubnVtZXJhdG9yLnZhbHVlKSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG5jb25zdCAgICAgICAgZmxvb3JEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sZmxvb3JEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5mbG9vckRpdmlkZUJ5KGZsb29yRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGNlaWxEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sY2VpbERpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmNlaWxEaXZpZGVCeShjZWlsRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGRpdmlkZUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCxyYXRpbyxiYW5rZXJzRGl2aWRlKTtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5kaXZpZGVCeShkaXZpZGVCeSk7XG5jb25zdCAgICAgICAgaW52ZXJ0UmF0aW89KHJhdGlvKT0+e1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5cbnJldHVybiBtYWtlUmF0aW8oXG4vKiogQHR5cGUge05hdFZhbHVlfSAqL3JhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4vKiogQHR5cGUge05hdFZhbHVlfSAqL3JhdGlvLm51bWVyYXRvci52YWx1ZSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmludmVydFJhdGlvKGludmVydFJhdGlvKTtcbmNvbnN0ICAgICAgICBhZGRSYXRpb3M9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbmFzc2VydElzUmF0aW8obGVmdCk7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0Lm51bWVyYXRvci5icmFuZCxcbnJpZ2h0Lm51bWVyYXRvci5icmFuZCxcblggYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuXG5hc3NlcnQuZXF1YWwoXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxucmlnaHQuZGVub21pbmF0b3IuYnJhbmQsXG5YIGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuXG5cbi8qIFNpbXBsaWZ5aW5nIHRoZSBleHByZXNzaW9uOiovXG4vKiAoYW5kICsgYm5kKSAvIHkgZCoqMiovXG4vKiAoYSArIGIpIG5kIC8geSBkKioyKi9cbi8qICgoYSArIGIpIG4gLyB5IGQpICogKGQgLyBkKSovXG4vKiAoYSArIGIpIG4gLyB5ZCovXG5yZXR1cm4gbWFrZVJhdGlvKFxuYWRkKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIGEgbmQqL1xubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5udW1lcmF0b3IudmFsdWUpLyogYiBuZCovKSxcbi8qIChhICsgYikgbmQqL1xubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiB5IGQqKjIqL1xubGVmdC5kZW5vbWluYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFkZFJhdGlvcyhhZGRSYXRpb3MpO1xuY29uc3QgICAgICAgIHN1YnRyYWN0UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5yaWdodC5udW1lcmF0b3IuYnJhbmQsXG5YIGBudW1lcmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuYXNzZXJ0LmVxdWFsKFxubGVmdC5kZW5vbWluYXRvci5icmFuZCxcbnJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kLFxuWCBgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuXG5yZXR1cm4gbWFrZVJhdGlvKFxuc3VidHJhY3QoXG5tdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksLyogYSBuZCovXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0Lm51bWVyYXRvci52YWx1ZSkvKiBiIG5kKi8pLFxuLyogKGEgLSBiKSBuZCovXG5sZWZ0Lm51bWVyYXRvci5icmFuZCxcbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIHkgZCoqMiovXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2Uuc3VidHJhY3RSYXRpb3Moc3VidHJhY3RSYXRpb3MpO1xuY29uc3QgICAgICAgIG11bHRpcGx5UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuXG5jb25zdCBnZXRSZW1haW5pbmdCcmFuZHM9KCk9Pntcbi8qIFByZWZlciByZXN1bHRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBicmFuZCBhcyB0aGUgbGVmdCBvcGVyYW5kLiovXG5pZihyaWdodC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQsbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuaWYocmlnaHQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQscmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuIH1cbmlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiB9XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxyaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuYXNzZXJ0LmZhaWwoWCBgYXQgbGVhc3Qgb25lIGJyYW5kIG11c3QgY2FuY2VsIG91dDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuIH07XG5cbmNvbnN0W251bWVyYXRvckJyYW5kLGRlbm9taW5hdG9yQnJhbmRdPWdldFJlbWFpbmluZ0JyYW5kcygpO1xucmV0dXJuIG1ha2VSYXRpbyhcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0Lm51bWVyYXRvci52YWx1ZSksXG5udW1lcmF0b3JCcmFuZCxcbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxuZGVub21pbmF0b3JCcmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHJhdGlvIGlzIGJldHdlZW4gMCBhbmQgMSwgc3VidHJhY3QgZnJvbSAxLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLm11bHRpcGx5UmF0aW9zKG11bHRpcGx5UmF0aW9zKTtcbmNvbnN0ICAgICAgICBvbmVNaW51cz0ocmF0aW8pPT57XG5hc3NlcnRJc1JhdGlvKHJhdGlvKTtcbnJhdGlvLm51bWVyYXRvci5icmFuZD09PXJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfHxcbmFzc2VydC5mYWlsKFxuWCBgb25lTWludXMgb25seSBzdXBwb3J0cyByYXRpb3Mgd2l0aCBhIHNpbmdsZSBicmFuZCwgYnV0ICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBkb2Vzbid0IG1hdGNoICR7cmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YCk7XG5cbnJhdGlvLm51bWVyYXRvci52YWx1ZTw9cmF0aW8uZGVub21pbmF0b3IudmFsdWV8fFxuYXNzZXJ0LmZhaWwoXG5YIGBQYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTogJHtyYXRpby5udW1lcmF0b3IudmFsdWV9LyR7cmF0aW8uZGVub21pbmF0b3IudmFsdWV9YCk7XG5cbnJldHVybiBtYWtlUmF0aW8oXG5zdWJ0cmFjdChyYXRpby5kZW5vbWluYXRvci52YWx1ZSxyYXRpby5udW1lcmF0b3IudmFsdWUpLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxucmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG5yYXRpby5udW1lcmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5vbmVNaW51cyhvbmVNaW51cyk7XG5jb25zdCAgICAgICAgcmF0aW9HVEU9KGxlZnQscmlnaHQpPT57XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PXJpZ2h0Lm51bWVyYXRvci5icmFuZCl7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxucmlnaHQuZGVub21pbmF0b3IuYnJhbmQsXG5YIGBudW1lcmF0b3IgYnJhbmRzIG1hdGNoLCBidXQgZGVub21pbmF0b3IgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbnJpZ2h0KVxuIH1gKTtcblxuIH1lbHNlIGlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5hc3NlcnQuZXF1YWwoXG5yaWdodC5udW1lcmF0b3IuYnJhbmQsXG5yaWdodC5kZW5vbWluYXRvci5icmFuZCxcblggYGxlZnRoYW5kIGJyYW5kcyBtYXRjaCwgYnV0IHJpZ2h0aGFuZCBicmFuZHMgZG9uJ3Q6ICR7cShsZWZ0KX0gJHtxKFxucmlnaHQpXG4gfWApO1xuXG4gfVxucmV0dXJuIG5hdFNhZmVNYXRoLmlzR1RFKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxubXVsdGlwbHkocmlnaHQubnVtZXJhdG9yLnZhbHVlLGxlZnQuZGVub21pbmF0b3IudmFsdWUpKTtcblxuIH07XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJhdGlvcyBhcmUgdGhlIHNhbWUgdmFsdWVzIChlcXVhbCBvciBlcXVpdmFsYW50IG1heSByZXR1cm4gZmFsc2UpXG4gKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5yYXRpb0dURShyYXRpb0dURSk7XG5jb25zdCAgICAgICAgcmF0aW9zU2FtZT0obGVmdCxyaWdodCk9PntcbnJldHVybihcbkFtb3VudE1hdGguaXNFcXVhbChsZWZ0Lm51bWVyYXRvcixyaWdodC5udW1lcmF0b3IpJiZcbkFtb3VudE1hdGguaXNFcXVhbChsZWZ0LmRlbm9taW5hdG9yLHJpZ2h0LmRlbm9taW5hdG9yKSk7XG5cbiB9O1xuXG4vKipcbiAqIE1ha2UgYW4gZXF1aXZhbGFudCByYXRpbyB3aXRoIGEgbmV3IGRlbm9taW5hdG9yXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7YmlnaW50fSBuZXdEZW5cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UucmF0aW9zU2FtZShyYXRpb3NTYW1lKTtcbmNvbnN0ICAgICAgICBxdWFudGl6ZT0ocmF0aW8sbmV3RGVuKT0+e1xuY29uc3Qgb2xkRGVuPXJhdGlvLmRlbm9taW5hdG9yLnZhbHVlO1xuY29uc3Qgb2xkTnVtPXJhdGlvLm51bWVyYXRvci52YWx1ZTtcbmNvbnN0IG5ld051bT1cbm5ld0Rlbj09PW9sZERlbj9vbGROdW06YmFua2Vyc0RpdmlkZShvbGROdW0qbmV3RGVuLG9sZERlbik7XG5yZXR1cm4gbWFrZVJhdGlvKFxubmV3TnVtLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxubmV3RGVuLFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQpO1xuXG4gfTskaOKAjV9vbmNlLnF1YW50aXplKHF1YW50aXplKTtcblxuY29uc3QgTlVNRVJJQ19SRT0vXihcXGRcXGQqKSg/OlxcLihcXGQqKSk/JC87XG5cbi8qKlxuICogQ3JlYXRlIGEgcmF0aW8gZnJvbSBhIGdpdmVuIG51bWVyaWMgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQYXJzYWJsZU51bWJlcn0gbnVtZXJpY1xuICogQHBhcmFtIHtCcmFuZH0gbnVtZXJhdG9yQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmR9IFtkZW5vbWluYXRvckJyYW5kXVxuICogQHJldHVybnMge1JhdGlvfVxuICovXG5jb25zdCAgICAgICAgcGFyc2VSYXRpbz0oXG5udW1lcmljLFxubnVtZXJhdG9yQnJhbmQsXG5kZW5vbWluYXRvckJyYW5kPW51bWVyYXRvckJyYW5kKT0+XG57XG5jb25zdCBtYXRjaD0gYCR7bnVtZXJpY31gLm1hdGNoKE5VTUVSSUNfUkUpO1xuYXNzZXJ0KG1hdGNoLFggYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke251bWVyaWN9YCk7XG5cbmNvbnN0W3dob2xlLHBhcnQ9JyddPVttYXRjaFsxXSxtYXRjaFsyXV07XG5yZXR1cm4gbWFrZVJhdGlvKFxuQmlnSW50KCBgJHt3aG9sZX0ke3BhcnR9YCksXG5udW1lcmF0b3JCcmFuZCxcbjEwbioqQmlnSW50KHBhcnQubGVuZ3RoKSxcbmRlbm9taW5hdG9yQnJhbmQpO1xuXG4gfTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayovXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFBhcnNhYmxlTnVtYmVyfVxuICovJGjigI1fb25jZS5wYXJzZVJhdGlvKHBhcnNlUmF0aW8pO1xuY29uc3QgICAgICAgIGFzc2VydFBhcnNhYmxlTnVtYmVyPShzcGVjaW1lbik9PntcbmNvbnN0IG1hdGNoPSBgJHtzcGVjaW1lbn1gLm1hdGNoKE5VTUVSSUNfUkUpO1xuYXNzZXJ0KG1hdGNoLFggYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke3NwZWNpbWVufWApO1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXJzYWJsZU51bWJlcihhc3NlcnRQYXJzYWJsZU51bWJlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SXNSYXRpbyI6WyJhc3NlcnRJc1JhdGlvIl0sIm1ha2VSYXRpbyI6WyJtYWtlUmF0aW8iXSwibWFrZVJhdGlvRnJvbUFtb3VudHMiOlsibWFrZVJhdGlvRnJvbUFtb3VudHMiXSwiZmxvb3JNdWx0aXBseUJ5IjpbImZsb29yTXVsdGlwbHlCeSJdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSJdLCJtdWx0aXBseUJ5IjpbIm11bHRpcGx5QnkiXSwiZmxvb3JEaXZpZGVCeSI6WyJmbG9vckRpdmlkZUJ5Il0sImNlaWxEaXZpZGVCeSI6WyJjZWlsRGl2aWRlQnkiXSwiZGl2aWRlQnkiOlsiZGl2aWRlQnkiXSwiaW52ZXJ0UmF0aW8iOlsiaW52ZXJ0UmF0aW8iXSwiYWRkUmF0aW9zIjpbImFkZFJhdGlvcyJdLCJzdWJ0cmFjdFJhdGlvcyI6WyJzdWJ0cmFjdFJhdGlvcyJdLCJtdWx0aXBseVJhdGlvcyI6WyJtdWx0aXBseVJhdGlvcyJdLCJvbmVNaW51cyI6WyJvbmVNaW51cyJdLCJyYXRpb0dURSI6WyJyYXRpb0dURSJdLCJyYXRpb3NTYW1lIjpbInJhdGlvc1NhbWUiXSwicXVhbnRpemUiOlsicXVhbnRpemUiXSwicGFyc2VSYXRpbyI6WyJwYXJzZVJhdGlvIl0sImFzc2VydFBhcnNhYmxlTnVtYmVyIjpbImFzc2VydFBhcnNhYmxlTnVtYmVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANa3TTvBBQAAwQUAADMAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9uYXQiXSwiZXhwb3J0cyI6WyJuYXRTYWZlTWF0aCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhlc2Ugb3BlcmF0aW9ucyBzaG91bGQgYmUgdXNlZCBmb3IgY2FsY3VsYXRpb25zIHdpdGggdGhlIHZhbHVlcyBvZlxuICogYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqIG5hdFNhZmVNYXRoIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZGlyZWN0bHksIGFuZCBzbyBpdCBuZWVkcyB0b1xuICogdmFsaWRhdGUgdGhlIGlucHV0cywgYXMgd2VsbCBhcyB0aGUgb3V0cHV0cyB3aGVuIG5lY2Vzc2FyeS5cbiAqL1xuY29uc3QgICAgICAgIG5hdFNhZmVNYXRoPWhhcmRlbih7XG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuYWRkOih4LHkpPT5OYXQoeCkrTmF0KHkpLFxuc3VidHJhY3Q6KHgseSk9Pk5hdChOYXQoeCktTmF0KHkpKSxcbm11bHRpcGx5Oih4LHkpPT5OYXQoeCkqTmF0KHkpLFxuZmxvb3JEaXZpZGU6KHgseSk9Pk5hdCh4KS9OYXQoeSksXG5jZWlsRGl2aWRlOih4LHkpPT57XG55PU5hdCh5KTtcbnJldHVybiBOYXQoTmF0KHgpK3ktMW4pL3k7XG4gfSxcbi8qKlxuICogRGl2aWRlIHVzaW5nIGhhbGYtdG8tZXZlbiAoYWthIEJhbmtlcidzIFJvdW5kaW5nKSBhcyBpbiBJRUVFIDc3NCBkZWZhdWx0IHJvdW5kaW5nXG4gKlxuICogQHBhcmFtIHtOYXRWYWx1ZX0gYVxuICogQHBhcmFtIHtOYXRWYWx1ZX0gYlxuICovXG5iYW5rZXJzRGl2aWRlOihhLGIpPT57XG5hPU5hdChhKTtcbmI9TmF0KGIpO1xuXG5jb25zdCBkaXY9YS9iO1xuY29uc3QgcmVtPWElYjtcbi8qIGlmIHJlbWFpbmRlciA+IGhhbGYgZGl2aXNvciwgc2hvdWxkIGhhdmUgcm91bmRlZCB1cCBpbnN0ZWFkIG9mIGRvd24sIHNvIGFkZCAxKi9cbmlmKHJlbSoybj5iKXtcbnJldHVybiBkaXYrMW47XG4gfWVsc2UgaWYocmVtKjJuPT09Yil7XG4vKiBBZGQgMSBpZiByZXN1bHQgaXMgb2RkIHRvIGdldCBhbiBldmVuIHJldHVybiB2YWx1ZSovXG5pZihkaXYlMm49PT0xbilyZXR1cm4gZGl2KzFuO1xuIH1cbnJldHVybiBkaXY7XG4gfSxcbmlzR1RFOih4LHkpPT5OYXQoeCk+PU5hdCh5KX0pOyRo4oCNX29uY2UubmF0U2FmZU1hdGgobmF0U2FmZU1hdGgpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdFNhZmVNYXRoIjpbIm5hdFNhZmVNYXRoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANlY69+FBAAAhQQAADcAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZVN0YXRlTWFjaGluZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qIGFsbG93ZWRUcmFuc2l0aW9ucyBpcyBhbiBhcnJheSBvZiBhcnJheXMgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhXG4gKiBtYXAuIFRoZSBtYXAgbWFwcyBzdHJpbmcgc3RhdGVzIHRvIGFuIGFycmF5IG9mIHBvdGVudGlhbCBuZXh0XG4gKiBzdGF0ZXMuIEZvciBleGFtcGxlLFxuICogY29uc3QgYWxsb3dlZFRyYW5zaXRpb25zID0gW1xuIFsnb3BlbicsIFsnY2xvc2VkJ11dLFxuIFsnY2xvc2VkJywgW11dLFxuICogXTtcbiovXG5jb25zdCBtYWtlU3RhdGVNYWNoaW5lPShpbml0aWFsU3RhdGUsYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpPT57XG5sZXQgc3RhdGU9aW5pdGlhbFN0YXRlO1xuY29uc3QgYWxsb3dlZFRyYW5zaXRpb25zPW5ldyBNYXAoYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpO1xucmV0dXJuIGhhcmRlbih7XG5jYW5UcmFuc2l0aW9uVG86KG5leHRTdGF0ZSk9PlxuYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSxcbnRyYW5zaXRpb25UbzoobmV4dFN0YXRlKT0+e1xuYXNzZXJ0KGFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSkpO1xuc3RhdGU9bmV4dFN0YXRlO1xuIH0sXG5nZXRTdGF0dXM6KF8pPT5zdGF0ZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdGF0ZU1hY2hpbmUobWFrZVN0YXRlTWFjaGluZSk7XG5oYXJkZW4obWFrZVN0YXRlTWFjaGluZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0YXRlTWFjaGluZSI6WyJtYWtlU3RhdGVNYWNoaW5lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAECKbPdfBQAAXwUAADUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY2FsY3VsYXRlTWVkaWFuIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gVHlwZWRNYXRoXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBUKSA9PiBUfSBhZGRcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IGJpZ2ludCkgPT4gVH0gZGl2aWRlXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBUKSA9PiBib29sZWFufSBpc0dURVxuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBtZWRpYW4gb2YgYSBzZXQgb2Ygc2FtcGxlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0FycmF5PFQ+fSBzYW1wbGVzIHRoZSBpbnB1dCBtZWFzdXJlbWVudHNcbiAqIEBwYXJhbSB7VHlwZWRNYXRoPFQ+fSBtYXRoXG4gKiBAcmV0dXJucyB7VD19IHRoZSBtZWRpYW4gKHVuZGVmaW5lZCBpZiBubyBzYW1wbGVzKVxuICovXG5jb25zdCAgICAgICAgY2FsY3VsYXRlTWVkaWFuPShzYW1wbGVzLG1hdGgpPT57XG5jb25zdCBzb3J0ZWQ9c2FtcGxlcy5zb3J0KChhLGIpPT57XG5pZighbWF0aC5pc0dURShhLGIpKXtcbnJldHVybi0xO1xuIH1lbHNlIGlmKCFtYXRoLmlzR1RFKGIsYSkpe1xucmV0dXJuIDE7XG4gfVxucmV0dXJuIDA7XG4gfSk7XG5cbmlmKHNvcnRlZC5sZW5ndGg9PT0wKXtcbi8qIE5vIHZhbGlkIHNhbXBsZXMsIGRvbid0IHJlcG9ydCBhbnl0aGluZy4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbmlmKHNvcnRlZC5sZW5ndGglMiE9PTApe1xuLyogT2RkIGxlbmd0aCwganVzdCBwaWNrIHRoZSBtaWRkbGUgZWxlbWVudC4qL1xucmV0dXJuIHNvcnRlZFsoc29ydGVkLmxlbmd0aC0xKS8yXTtcbiB9XG5cbi8qIEV2ZW4gbGVuZ3RoLCB0YWtlIHRoZSBtZWFuIG9mIHRoZSB0d28gbWlkZGxlIHZhbHVlcy4qL1xuY29uc3Qgc2Vjb25kSW5kZXg9c29ydGVkLmxlbmd0aC8yO1xuY29uc3Qgc3VtPW1hdGguYWRkKHNvcnRlZFtzZWNvbmRJbmRleC0xXSxzb3J0ZWRbc2Vjb25kSW5kZXhdKTtcbnJldHVybiBtYXRoLmRpdmlkZShzdW0sMm4pO1xuIH07JGjigI1fb25jZS5jYWxjdWxhdGVNZWRpYW4oY2FsY3VsYXRlTWVkaWFuKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxjdWxhdGVNZWRpYW4iOlsiY2FsY3VsYXRlTWVkaWFuIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMruLwmmCwAApgsAADAAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRHYWluc0xvc3Nlc1JlY29yZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zIC0gd2hhdCB0aGUgc2VhdCB3aWxsXG4gKiBnYWluIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZD19IGxvc3NlcyAtIHdoYXQgdGhlIHNlYXQgd2lsbFxuICogZ2l2ZSB1cCBhcyBhIHJlc3VsdCBvZiB0aGlzIHRyYWRlLiBMb3NzZXMgaXMgb3B0aW9uYWwsIGJ1dCBjYW5cbiAqIG9ubHkgYmUgb21pdHRlZCBpZiB0aGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgYXJlIHRoZSBzYW1lLlxuICogSWYgbG9zc2VzIGlzIG5vdCBkZWZpbmVkLCB0aGUgZ2FpbnMgb2YgdGhlIG90aGVyIHNlYXQgaXNcbiAqIHN1YnRyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3dhcFxuICogSWYgdHdvIHNlYXRzIGNhbiBzYXRpc2Z5IGVhY2ggb3RoZXIncyB3YW50cywgdHJhZGUgZW5vdWdoIHRvXG4gKiBzYXRpc2Z5IHRoZSB3YW50cyBvZiBib3RoIHNlYXRzIGFuZCBleGl0IGJvdGggc2VhdHMuXG4gKlxuICogVGhlIHN1cnBsdXMgcmVtYWlucyB3aXRoIHRoZSBvcmlnaW5hbCBzZWF0LiBGb3IgZXhhbXBsZSBpZiBzZWF0IEFcbiAqIGdpdmVzIDUgbW9vbGEgYW5kIHNlYXQgQiBvbmx5IHdhbnRzIDMgbW9vbGEsIHNlYXQgQSByZXRhaW5zIDJcbiAqIG1vb2xhLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIFRoZSBrZXl3b3JkcyBmb3IgYm90aCBzZWF0cyBtdXN0IG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBFeGFjdFxuICpcbiAqIFN3YXAgc3VjaCB0aGF0IGJvdGggc2VhdHMgZ2FpbiB3aGF0IHRoZXkgd2FudCBhbmQgbG9zZSBldmVyeXRoaW5nXG4gKiB0aGF0IHRoZXkgZ2F2ZS4gT25seSBnb29kIGZvciBleGFjdCBhbmQgZW50aXJlIHN3YXBzIHdoZXJlIGVhY2hcbiAqIHNlYXQgd2FudHMgZXZlcnl0aGluZyB0aGF0IHRoZSBvdGhlciBzZWF0IGhhcy4gVGhlIGJlbmVmaXQgb2YgdXNpbmdcbiAqIHRoaXMgbWV0aG9kIGlzIHRoYXQgdGhlIGtleXdvcmRzIG9mIGVhY2ggc2VhdCBkbyBub3QgbWF0dGVyLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEtleXdvcmQ+fSBLZXl3b3JkS2V5d29yZFJlY29yZFxuICpcbiAqIEEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3Jkcy5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXZlcnNlXG4gKlxuICogR2l2ZW4gYSBtYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtleXdvcmRzLCBpbnZlcnQgdGhlIGtleXMgYW5kXG4gKiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB0byBtYXAgdGhlIG9mZmVycyBtYWRlIHRvIGFub3RoZXIgY29udHJhY3RcbiAqIGJhY2sgdG8gdGhlIGtleXdvcmRzIHVzZWQgaW4gdGhlIGZpcnN0IGNvbnRyYWN0LlxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZD19IGtleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtLZXl3b3JkS2V5d29yZFJlY29yZCB9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFwS2V5d29yZHNcbiAqXG4gKiBSZW1hcCB0aGUga2V5d29yZHMgb2YgYW4gYW1vdW50S2V5d29yZFJlY29yZCwgaXNzdWVyS2V5d29yZFJlY29yZCwgb3IgYVxuICogUGF5bWVudFBLZXl3b3JkUmVjb3JkIGFjY29yZGluZyB0byBhIG1hcHBpbmcuIFRoaXMgaXMgdXNlZCB0byByZW1hcFxuICogZnJvbSBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QSB0byBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QiBhbmRcbiAqIHZpY2UgdmVyc2EgaW4gYG9mZmVyVG9gXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkIHwgUGF5bWVudFBLZXl3b3JkUmVjb3JkIHwgSXNzdWVyS2V5d29yZFJlY29yZCB8IHVuZGVmaW5lZCB9IGtleXdvcmRSZWNvcmRcbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmR9IGtleXdvcmRNYXBwaW5nXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYXRpb1xuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBudW1lcmF0b3JcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gZGVub21pbmF0b3JcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTY2FsZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANwmhyfuOgAA7joAADUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydFByb3Bvc2FsU2hhcGUiLCJjaGVja1pDRiIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVwb3NpdFRvU2VhdCIsImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIiwiZml0UHJvcG9zYWxTaGFwZSIsIm1hcEtleXdvcmRzIiwib2ZmZXJUbyIsInNhdGlzZmllcyIsInNhdmVBbGxJc3N1ZXJzIiwic3dhcCIsInN3YXBFeGFjdCIsIndpdGhkcmF3RnJvbVNlYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZml0LGtleUVRLEUsbWFrZVByb21pc2VLaXQsQXNzZXRLaW5kLGZyb21VbmlxdWVFbnRyaWVzLHNhdGlzZmllc1dhbnQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1wiLCBbW1wic2F0aXNmaWVzV2FudFwiLCBbJGjigI1fYSA9PiAoc2F0aXNmaWVzV2FudCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3QgICAgICAgIGRlZmF1bHRBY2NlcHRhbmNlTXNnPSBgVGhlIG9mZmVyIGhhcyBiZWVuIGFjY2VwdGVkLiBPbmNlIHRoZSBjb250cmFjdCBoYXMgYmVlbiBjb21wbGV0ZWQsIHBsZWFzZSBjaGVjayB5b3VyIHBheW91dGA7JGjigI1fb25jZS5kZWZhdWx0QWNjZXB0YW5jZU1zZyhkZWZhdWx0QWNjZXB0YW5jZU1zZyk7XG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCBnZXRLZXlzU29ydGVkPShvYmopPT5oYXJkZW4oUmVmbGVjdC5vd25LZXlzKG9ianx8e30pLnNvcnQoKSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRJc3N1ZXJLZXl3b3Jkcz0oemNmLGV4cGVjdGVkKT0+e1xuY29uc3R7aXNzdWVyc309emNmLmdldFRlcm1zKCk7XG5jb25zdCBhY3R1YWw9Z2V0S2V5c1NvcnRlZChpc3N1ZXJzKTtcbmV4cGVjdGVkPVsuLi5leHBlY3RlZF07LyogaW4gY2FzZSBoYXJkZW5lZCovXG5leHBlY3RlZC5zb3J0KCk7XG5rZXlFUShhY3R1YWwsaGFyZGVuKGV4cGVjdGVkKSl8fFxuYXNzZXJ0LmZhaWwoWCBga2V5d29yZHM6ICR7YWN0dWFsfSB3ZXJlIG5vdCBhcyBleHBlY3RlZDogJHtleHBlY3RlZH1gKTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpjZlNlYXRQYXJ0aWFsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb3Bvc2FsUmVjb3JkfSBnZXRQcm9wb3NhbFxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRDdXJyZW50QWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhbiB1cGRhdGUgdG8gY3VycmVudEFsbG9jYXRpb24gc2F0aXNmaWVzXG4gKiBwcm9wb3NhbC53YW50LiBOb3RlIHRoYXQgdGhpcyBpcyBoYWxmIG9mIHRoZSBvZmZlciBzYWZldHlcbiAqIGNoZWNrOyB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGNvbnN0aXR1dGVzIGEgcmVmdW5kIGlzIG5vdFxuICogY2hlY2tlZC4gVGhlIHVwZGF0ZSBpcyBtZXJnZWQgd2l0aCBjdXJyZW50QWxsb2NhdGlvblxuICogKHVwZGF0ZSdzIHZhbHVlcyBwcmV2YWlsaW5nIGlmIHRoZSBrZXl3b3JkcyBhcmUgdGhlIHNhbWUpXG4gKiB0byBwcm9kdWNlIHRoZSBuZXdBbGxvY2F0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgZm9yXG4gKiBmYWxzZSBhbmQgMSBmb3IgdHJ1ZS4gV2hlbiBtdWx0aXBsZXMgYXJlIGludHJvZHVjZWQsIGFueVxuICogcG9zaXRpdmUgcmV0dXJuIHZhbHVlIHdpbGwgbWVhbiB0cnVlLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WmNmU2VhdFBhcnRpYWx9IHNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gdXBkYXRlXG4gKiBAcmV0dXJucyB7MHwxfVxuICovJGjigI1fb25jZS5hc3NlcnRJc3N1ZXJLZXl3b3Jkcyhhc3NlcnRJc3N1ZXJLZXl3b3Jkcyk7XG5jb25zdCAgICAgICAgc2F0aXNmaWVzPSh6Y2Ysc2VhdCx1cGRhdGUpPT57XG5jb25zdCBjdXJyZW50QWxsb2NhdGlvbj1zZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCk7XG5jb25zdCBuZXdBbGxvY2F0aW9uPXsuLi5jdXJyZW50QWxsb2NhdGlvbiwuLi51cGRhdGV9O1xuY29uc3QgcHJvcG9zYWw9c2VhdC5nZXRQcm9wb3NhbCgpO1xucmV0dXJuIHNhdGlzZmllc1dhbnQocHJvcG9zYWwsbmV3QWxsb2NhdGlvbik7XG4gfTtcblxuLyoqIEB0eXBlIHtTd2FwfSAqLyRo4oCNX29uY2Uuc2F0aXNmaWVzKHNhdGlzZmllcyk7XG5jb25zdCAgICAgICAgc3dhcD0oemNmLGxlZnRTZWF0LHJpZ2h0U2VhdCk9PntcbnRyeXtcbnJpZ2h0U2VhdC5kZWNyZW1lbnRCeShoYXJkZW4obGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSk7XG5sZWZ0U2VhdC5pbmNyZW1lbnRCeShoYXJkZW4obGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSk7XG5cbmxlZnRTZWF0LmRlY3JlbWVudEJ5KGhhcmRlbihyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSk7XG5yaWdodFNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpKTtcblxuemNmLnJlYWxsb2NhdGUobGVmdFNlYXQscmlnaHRTZWF0KTtcbiB9Y2F0Y2goZXJyKXtcbmxlZnRTZWF0LmZhaWwoZXJyKTtcbnJpZ2h0U2VhdC5mYWlsKGVycik7XG50aHJvdyBlcnI7XG4gfVxuXG5sZWZ0U2VhdC5leGl0KCk7XG5yaWdodFNlYXQuZXhpdCgpO1xucmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xuIH07XG5cbi8qKiBAdHlwZSB7U3dhcEV4YWN0fSAqLyRo4oCNX29uY2Uuc3dhcChzd2FwKTtcbmNvbnN0ICAgICAgICBzd2FwRXhhY3Q9KHpjZixsZWZ0U2VhdCxyaWdodFNlYXQpPT57XG50cnl7XG5yaWdodFNlYXQuZGVjcmVtZW50QnkoaGFyZGVuKHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLmdpdmUpKTtcbmxlZnRTZWF0LmluY3JlbWVudEJ5KGhhcmRlbihsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpKTtcblxubGVmdFNlYXQuZGVjcmVtZW50QnkoaGFyZGVuKGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSkpO1xucmlnaHRTZWF0LmluY3JlbWVudEJ5KGhhcmRlbihyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSk7XG5cbnpjZi5yZWFsbG9jYXRlKGxlZnRTZWF0LHJpZ2h0U2VhdCk7XG4gfWNhdGNoKGVycil7XG5sZWZ0U2VhdC5mYWlsKGVycik7XG5yaWdodFNlYXQuZmFpbChlcnIpO1xudGhyb3cgZXJyO1xuIH1cblxubGVmdFNlYXQuZXhpdCgpO1xucmlnaHRTZWF0LmV4aXQoKTtcbnJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cGVjdGVkUmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxLZXl3b3JkLCBudWxsPn0gW3dhbnRdXG4gKiBAcHJvcGVydHkge1JlY29yZDxLZXl3b3JkLCBudWxsPn0gW2dpdmVdXG4gKiBAcHJvcGVydHkge1BhcnRpYWw8UmVjb3JkPGtleW9mIFByb3Bvc2FsUmVjb3JkWydleGl0J10sIG51bGw+Pn0gW2V4aXRdXG4gKi9cblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYHByb3Bvc2FsU2hhcGVgLlxuICogSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtQYXR0ZXJufSBwcm9wb3NhbFNoYXBlXG4gKi8kaOKAjV9vbmNlLnN3YXBFeGFjdChzd2FwRXhhY3QpO1xuY29uc3QgICAgICAgIGZpdFByb3Bvc2FsU2hhcGU9KHNlYXQscHJvcG9zYWxTaGFwZSk9PlxuLyogVE9ETyByZW1vdmUgdGhpcyBoYXJkZW4sIG9ibGlnYXRpbmcgb3VyIGNhbGxlciB0byBoYXJkZW4uKi9cbmZpdChzZWF0LmdldFByb3Bvc2FsKCksaGFyZGVuKHByb3Bvc2FsU2hhcGUpLCdwcm9wb3NhbCcpO1xuXG4vKipcbiAqIENoZWNrIHRoZSBzZWF0J3MgcHJvcG9zYWwgYWdhaW5zdCBhbiBgZXhwZWN0ZWRgIHJlY29yZCB0aGF0IHNheXNcbiAqIHdoYXQgXCJzaGFwZVwiIG9mIHByb3Bvc2FsIGlzIGFjY2VwdGFibGUuXG4gKlxuICogTm90ZSB0aGF0IGJ5IG91ciBjdXJyZW50IHRlcm1pbm9sb2d5LCB0aGlzIGZ1bmN0aW9uIGlzIG1pc25hbWVkIGJlY2F1c2VcbiAqIHdlIHVzZVxuICogW1wiU2hhcGVcIiB0byByZWZlciB0byBwYXR0ZXJuc10oaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3N0b3JlL3NyYy90eXBlcy5qcyNMNTYtTDc0KSxcbiAqIGFuZCB0aGUgYGV4cGVjdGVkYCBhcmd1bWVudCBpcyBub3Qgc3VjaCBhIHBhdHRlcm4uIFJhdGhlciBpdCBpcyBhbiBhZC1ob2NcbiAqIHBhdHRlcm4tbGlrZSBzcGVjaWFsIGNhc2UgcmVjb3JkIHRoYXQgaXMgZGlmZmVyZW50IGFuZCBtdWNoIGxlc3MgZXhwcmVzc2l2ZS5cbiAqXG4gKiBUaGlzIEV4cGVjdGVkUmVjb3JkIGlzIGxpa2UgYSBQcm9wb3NhbCwgYnV0IHRoZSBhbW91bnRzIGluICd3YW50J1xuICogYW5kICdnaXZlJyBzaG91bGQgYmUgbnVsbDsgdGhlIGV4aXQgY2xhdXNlIHNob3VsZCBzcGVjaWZ5IGEgcnVsZSB3aXRoXG4gKiBudWxsIGNvbnRlbnRzLiBJZiB0aGUgY2xpZW50IHN1Ym1pdHMgYW4gb2ZmZXIgd2hpY2ggZG9lcyBub3QgbWF0Y2hcbiAqIHRoZXNlIGV4cGVjdGF0aW9ucywgdGhlIHNlYXQgd2lsbCBiZSBleGl0ZWQgKGFuZCBwYXltZW50cyByZWZ1bmRlZCkuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIG9wdGlvbmFsIGBwcm9wb3NhbFNoYXBlYCBhcmd1bWVudCB0byBgbWFrZUludml0YXRpb25gIHdpdGhcbiAqIGEgZ2VudWluZSBwYXR0ZXJuLlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0V4cGVjdGVkUmVjb3JkfSBleHBlY3RlZFxuICovJGjigI1fb25jZS5maXRQcm9wb3NhbFNoYXBlKGZpdFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIGFzc2VydFByb3Bvc2FsU2hhcGU9KHNlYXQsZXhwZWN0ZWQpPT57XG5hc3NlcnQudHlwZW9mKGV4cGVjdGVkLCdvYmplY3QnKTtcbmFzc2VydCghQXJyYXkuaXNBcnJheShleHBlY3RlZCksJ0V4cGVjdGVkIG11c3QgYmUgYW4gbm9uLWFycmF5IG9iamVjdCcpO1xuY29uc3QgYXNzZXJ0VmFsdWVzTnVsbD0oZSk9PntcbmlmKGUhPT11bmRlZmluZWQpe1xuT2JqZWN0LnZhbHVlcyhlKS5mb3JFYWNoKCh2YWx1ZSk9PlxuYXNzZXJ0KFxudmFsdWU9PT1udWxsLFxuWCBgVGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZCByZWNvcmQgbXVzdCBiZSBudWxsIGJ1dCB3YXMgJHt2YWx1ZX1gKSk7XG5cblxuIH1cbiB9O1xuXG4vKiBBc3NlcnQgdmFsdWVzIG9mIHRoZSBleHBlY3RlZCByZWNvcmQgYXJlIGFsbCBudWxsLiBXZSBkbyBub3QqL1xuLyogY2hlY2sgdGhlIHZhbHVlcyBvZiB0aGUgYWN0dWFsIHByb3Bvc2FsLiovXG5hc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmdpdmUpO1xuYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC53YW50KTtcbmFzc2VydFZhbHVlc051bGwoZXhwZWN0ZWQuZXhpdCk7XG5cbmNvbnN0IGFjdHVhbD1zZWF0LmdldFByb3Bvc2FsKCk7XG5jb25zdCBhc3NlcnRLZXlzPShhLGUpPT57XG5pZihlIT09dW5kZWZpbmVkKXtcbmtleUVRKGdldEtleXNTb3J0ZWQoYSksZ2V0S2V5c1NvcnRlZChlKSl8fFxuYXNzZXJ0LmZhaWwoWCBgYWN0dWFsICR7YX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCAke2V9YCk7XG4gfVxuIH07XG5hc3NlcnRLZXlzKGFjdHVhbC5naXZlLGV4cGVjdGVkLmdpdmUpO1xuYXNzZXJ0S2V5cyhhY3R1YWwud2FudCxleHBlY3RlZC53YW50KTtcbmFzc2VydEtleXMoYWN0dWFsLmV4aXQsZXhwZWN0ZWQuZXhpdCk7XG4gfTtcblxuLyogR2l2ZW4gYSBicmFuZCwgYXNzZXJ0IHRoYXQgYnJhbmQgaXMgQXNzZXRLaW5kLk5BVC4gKi8kaOKAjV9vbmNlLmFzc2VydFByb3Bvc2FsU2hhcGUoYXNzZXJ0UHJvcG9zYWxTaGFwZSk7XG5jb25zdCAgICAgICAgYXNzZXJ0TmF0QXNzZXRLaW5kPSh6Y2YsYnJhbmQpPT57XG5hc3NlcnQoXG56Y2YuZ2V0QXNzZXRLaW5kKGJyYW5kKT09PUFzc2V0S2luZC5OQVQsXG4nYnJhbmQgbXVzdCBiZSBBc3NldEtpbmQuTkFUJyk7XG5cbiB9OyRo4oCNX29uY2UuYXNzZXJ0TmF0QXNzZXRLaW5kKGFzc2VydE5hdEFzc2V0S2luZCk7XG5cbmNvbnN0ICAgICAgICBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZz0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmA7XG5cbi8qKlxuICogRGVwb3NpdCBwYXltZW50cyBzdWNoIHRoYXQgdGhlaXIgYW1vdW50cyBhcmUgcmVhbGxvY2F0ZWQgdG8gYSBzZWF0LlxuICogVGhlIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nXG4gKiBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJlY2lwaWVudFNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHBhcmFtIHtQYXltZW50UEtleXdvcmRSZWNvcmR9IHBheW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uIHN1Y2Nlc3NmdWwuYFxuICovJGjigI1fb25jZS5kZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyhkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyk7XG5jb25zdCAgICAgICAgZGVwb3NpdFRvU2VhdD1hc3luYyh6Y2YscmVjaXBpZW50U2VhdCxhbW91bnRzLHBheW1lbnRzKT0+e1xuYXNzZXJ0KCFyZWNpcGllbnRTZWF0Lmhhc0V4aXRlZCgpLCdUaGUgcmVjaXBpZW50U2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuJyk7XG5cbi8qIFdlIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IG9mZmVyIHRvIGJlIGFibGUgdG8gZXNjcm93IG91ciBwYXltZW50cyovXG4vKiB3aXRoIFpvZS4qL1xuY29uc3QgcmVhbGxvY2F0ZUFmdGVyRGVwb3NpdD0odGVtcFNlYXQpPT57XG4vKiBBZnRlciB0aGUgYXNzZXRzIGFyZSBkZXBvc2l0ZWQsIHJlYWxsb2NhdGUgdGhlbSBvbnRvIHRoZSByZWNpcGllbnQgc2VhdCBhbmQqL1xuLyogZXhpdCB0aGUgdGVtcG9yYXJ5IHNlYXQuIE5vdGUgdGhhdCB0aGUgb2ZmZXJSZXN1bHQgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzKi9cbi8qIGZ1bmN0aW9uLCBzbyB0aGlzIHN5bmNocm9ub3VzIHRyYWRlIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUqL1xuLyogb2ZmZXJSZXN1bHQgcmVzb2x2ZXMuKi9cbnRlbXBTZWF0LmRlY3JlbWVudEJ5KGhhcmRlbihhbW91bnRzKSk7XG5yZWNpcGllbnRTZWF0LmluY3JlbWVudEJ5KGhhcmRlbihhbW91bnRzKSk7XG56Y2YucmVhbGxvY2F0ZSh0ZW1wU2VhdCxyZWNpcGllbnRTZWF0KTtcbnRlbXBTZWF0LmV4aXQoKTtcbnJldHVybiBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZztcbiB9O1xuY29uc3QgaW52aXRhdGlvbj16Y2YubWFrZUludml0YXRpb24oXG5yZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0LFxuJ3RlbXBvcmFyeSBzZWF0IGZvciBkZXBvc2l0Jyk7XG5cbmNvbnN0IHByb3Bvc2FsPWhhcmRlbih7Z2l2ZTphbW91bnRzfSk7XG5oYXJkZW4ocGF5bWVudHMpO1xuLyogVG8gZXNjcm93IHRoZSBwYXltZW50LCB3ZSBtdXN0IGdldCB0aGUgWm9lIFNlcnZpY2UgZmFjZXQgYW5kKi9cbi8qIG1ha2UgYW4gb2ZmZXIqL1xuY29uc3Qgem9lPXpjZi5nZXRab2VTZXJ2aWNlKCk7XG5jb25zdCB0ZW1wVXNlclNlYXQ9RSh6b2UpLm9mZmVyKGludml0YXRpb24scHJvcG9zYWwscGF5bWVudHMpO1xuLyogVGhpcyB3aWxsIGJlIGEgcHJvbWlzZSBmb3IgdGhlIHN0cmluZzogYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiovXG4vKiBzdWNjZXNzZnVsLmAgSXQgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGFzc2V0cyBoYXZlIGJlZW4qL1xuLyogc3VjY2Vzc2Z1bGx5IHJlYWxsb2NhdGVkIHRvIHRoZSByZWNpcGllbnQgc2VhdC4qL1xucmV0dXJuIEUodGVtcFVzZXJTZWF0KS5nZXRPZmZlclJlc3VsdCgpO1xuIH07XG5cbi8qKlxuICogV2l0aGRyYXcgcGF5bWVudHMgZnJvbSBhIHNlYXQuIE5vdGUgdGhhdCB3aXRoZHJhd2luZyB0aGUgYW1vdW50cyBvZlxuICogdGhlIHBheW1lbnRzIG11c3Qgbm90IGFuZCBjYW5ub3QgdmlvbGF0ZSBvZmZlciBzYWZldHkgZm9yIHRoZSBzZWF0LiBUaGVcbiAqIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nIGtleXdvcmRzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50UEtleXdvcmRSZWNvcmQ+fVxuICovJGjigI1fb25jZS5kZXBvc2l0VG9TZWF0KGRlcG9zaXRUb1NlYXQpO1xuY29uc3QgICAgICAgIHdpdGhkcmF3RnJvbVNlYXQ9YXN5bmMoemNmLHNlYXQsYW1vdW50cyk9PntcbmFzc2VydCghc2VhdC5oYXNFeGl0ZWQoKSwnVGhlIHNlYXQgY2Fubm90IGhhdmUgZXhpdGVkLicpO1xuY29uc3R7emNmU2VhdDp0ZW1wU2VhdCx1c2VyU2VhdDp0ZW1wVXNlclNlYXRQfT16Y2YubWFrZUVtcHR5U2VhdEtpdCgpO1xuc2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oYW1vdW50cykpO1xudGVtcFNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKGFtb3VudHMpKTtcbnpjZi5yZWFsbG9jYXRlKHRlbXBTZWF0LHNlYXQpO1xudGVtcFNlYXQuZXhpdCgpO1xucmV0dXJuIEUodGVtcFVzZXJTZWF0UCkuZ2V0UGF5b3V0cygpO1xuIH07XG5cbi8qKlxuICogU2F2ZSBhbGwgb2YgdGhlIGlzc3VlcnMgaW4gYW4gaXNzdWVyc0tleXdvcmRSZWNvcmQgdG8gWkNGLCB1c2luZ1xuICogdGhlIG1ldGhvZCBgemNmLnNhdmVJc3N1ZXJgLiBUaGlzIGRvZXMgbm90IGVycm9yIGlmIGFueSBvZiB0aGUga2V5d29yZHNcbiAqIGFscmVhZHkgZXhpc3QuIElmIHRoZSBrZXl3b3JkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcktleXdvcmRSZWNvcmQgSXNzdWVycyB0byBzYXZlIHRvXG4gKiBaQ0ZcbiAqLyRo4oCNX29uY2Uud2l0aGRyYXdGcm9tU2VhdCh3aXRoZHJhd0Zyb21TZWF0KTtcbmNvbnN0ICAgICAgICBzYXZlQWxsSXNzdWVycz1hc3luYyh6Y2YsaXNzdWVyS2V5d29yZFJlY29yZD1oYXJkZW4oe30pKT0+e1xuY29uc3R7aXNzdWVyc309emNmLmdldFRlcm1zKCk7XG5jb25zdCBpc3N1ZXJzUFNhdmVkPU9iamVjdC5lbnRyaWVzKGlzc3VlcktleXdvcmRSZWNvcmQpLm1hcChcbihba2V5d29yZCxpc3N1ZXJdKT0+e1xuLyogSWYgdGhlIGtleXdvcmQgZG9lcyBub3QgeWV0IGV4aXN0LCBhZGQgaXQgYW5kIHRoZSovXG4vKiBhc3NvY2lhdGVkIGlzc3Vlci4qL1xuaWYoaXNzdWVyc1trZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gemNmLnNhdmVJc3N1ZXIoaXNzdWVyLGtleXdvcmQpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfSk7XG5cbnJldHVybiBQcm9taXNlLmFsbChpc3N1ZXJzUFNhdmVkKTtcbiB9O1xuXG4vKiogQHR5cGUge01hcEtleXdvcmRzfSAqLyRo4oCNX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuY29uc3QgICAgICAgIG1hcEtleXdvcmRzPShrZXl3b3JkUmVjb3JkPXt9LGtleXdvcmRNYXBwaW5nKT0+e1xucmV0dXJuIGhhcmRlbihcbmZyb21VbmlxdWVFbnRyaWVzKFxuT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5d29yZCx2YWx1ZV0pPT57XG5pZihrZXl3b3JkTWFwcGluZ1trZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm5ba2V5d29yZCx2YWx1ZV07XG4gfVxucmV0dXJuW2tleXdvcmRNYXBwaW5nW2tleXdvcmRdLHZhbHVlXTtcbiB9KSkpO1xuXG5cbiB9O1xuLyoqIEB0eXBlIHtSZXZlcnNlfSAqLyRo4oCNX29uY2UubWFwS2V5d29yZHMobWFwS2V5d29yZHMpO1xuY29uc3QgcmV2ZXJzZT0oa2V5d29yZFJlY29yZD17fSk9PntcbnJldHVybiBoYXJkZW4oXG5mcm9tVW5pcXVlRW50cmllcyhcbk9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleSx2YWx1ZV0pPT5bdmFsdWUsa2V5XSkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBNYWtlIGFuIG9mZmVyIHRvIGFub3RoZXIgY29udHJhY3QgaW5zdGFuY2UgKGxhYmVsZWQgY29udHJhY3RCIGJlbG93KSxcbiAqIHdpdGhkcmF3aW5nIHRoZSBwYXltZW50cyBmb3IgdGhlIG9mZmVyIGZyb20gYSBzZWF0IGluIHRoZSBjdXJyZW50XG4gKiBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKSBhbmQgZGVwb3NpdGluZyB0aGUgcGF5b3V0cyBpbiBhbm90aGVyXG4gKiBzZWF0IGluIHRoZSBjdXJyZW50IGNvbnRyYWN0IGluc3RhbmNlIChjb250cmFjdEEpLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqICAgWm9lIENvbnRyYWN0IEZhY2V0IGZvciBjb250cmFjdEFcbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbjxSZXN1bHQsIEFyZ3M+Pn0gaW52aXRhdGlvblxuICogICBJbnZpdGF0aW9uIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmQgfCB1bmRlZmluZWR9IGtleXdvcmRNYXBwaW5nXG4gKiAgIE1hcHBpbmcgb2Yga2V5d29yZHMgdXNlZCBpbiBjb250cmFjdEEgdG8ga2V5d29yZHMgdG8gYmUgdXNlZCBpblxuICogICBjb250cmFjdEIuIE5vdGUgdGhhdCB0aGUgcGF0aHdheSB0byBkZXBvc2l0IHRoZSBwYXlvdXQgYmFjayB0b1xuICogICBjb250cmFjdEEgcmV2ZXJzZXMgdGhpcyBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWx9IHByb3Bvc2FsXG4gKiAgIFRoZSBwcm9wb3NhbCBmb3IgdGhlIG9mZmVyIHRvIGJlIG1hZGUgdG8gY29udHJhY3RCXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmcm9tU2VhdFxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gdGFrZSB0aGUgb2ZmZXIgcGF5bWVudHMgZnJvbS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXQ9fSBbdG9TZWF0PWZyb21TZWF0XVxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IG9mIHRoZSBvZmZlciB0by5cbiAqICAgSWYgYHRvU2VhdGAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGRlZmF1bHRzIHRvIHRoZSBgZnJvbVNlYXRgLlxuICpcbiAqIEBwYXJhbSB7QXJnc30gW29mZmVyQXJnc11cbiAqICAgQWRkaXRpb25hbCBjb250cmFjdC1zcGVjaWZpYyBvcHRpb25hbCBhcmd1bWVudHMgaW4gYSByZWNvcmQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8e3VzZXJTZWF0UHJvbWlzZTogUHJvbWlzZTxVc2VyU2VhdDxSZXN1bHQ+PiwgZGVwb3NpdGVkOiBQcm9taXNlPEFtb3VudEtleXdvcmRSZWNvcmQ+fT59XG4gKiAgIEEgcHJvbWlzZSBmb3IgdGhlIHVzZXJTZWF0IGZvciB0aGUgb2ZmZXIgdG8gdGhlIG90aGVyIGNvbnRyYWN0LCBhbmQgYVxuICogICBwcm9taXNlIChgZGVwb3NpdGVkYCkgd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGF5b3V0IGZvciB0aGUgb2ZmZXIgaGFzIGJlZW5cbiAqICAgZGVwb3NpdGVkIHRvIHRoZSBgdG9TZWF0YC5cbiAqICAgQW55IGZhaWx1cmVzIG9mIHRoZSBpbnZpdGF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYnkgYHVzZXJTZWF0UHJvbWlzZS5nZXRPZmZlclJlc3VsdCgpYC5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdD19IEFyZ3MgT2ZmZXIgYXJnc1xuICogQHRlbXBsYXRlIHtvYmplY3Q9fSBSZXN1bHQgT2ZmZXIgcmVzdWx0XG4gKi9cbmNvbnN0ICAgICAgICBvZmZlclRvPWFzeW5jKFxuemNmLFxuaW52aXRhdGlvbixcbmtleXdvcmRNYXBwaW5nLFxucHJvcG9zYWwsXG5mcm9tU2VhdCxcbnRvU2VhdCxcbm9mZmVyQXJncyk9Plxue1xuaWYoa2V5d29yZE1hcHBpbmc9PT11bmRlZmluZWQpe1xua2V5d29yZE1hcHBpbmc9aGFyZGVuKHt9KTtcbiB9XG5cbmNvbnN0IGRlZmluZWRUb1NlYXQ9dG9TZWF0IT09dW5kZWZpbmVkP3RvU2VhdDpmcm9tU2VhdDtcblxuY29uc3Qgem9lPXpjZi5nZXRab2VTZXJ2aWNlKCk7XG5jb25zdCBtYXBwaW5nUmV2ZXJzZWQ9cmV2ZXJzZShrZXl3b3JkTWFwcGluZyk7XG5cbmNvbnN0IG5ld0tleXdvcmRzPVxucHJvcG9zYWwhPT11bmRlZmluZWQ/XG5tYXBLZXl3b3Jkcyhwcm9wb3NhbC5naXZlLG1hcHBpbmdSZXZlcnNlZCk6XG5oYXJkZW4oe30pO1xuXG4vKiB0aGUgcHJvcG9zYWwgaXMgaW4gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMsIGJ1dCB3ZSB3YW50IHRvKi9cbi8qIHVzZSBgcHJvcG9zYWwuZ2l2ZWAgdG8gd2l0aGRyYXcqL1xuY29uc3QgcGF5bWVudHM9YXdhaXQgd2l0aGRyYXdGcm9tU2VhdCh6Y2YsZnJvbVNlYXQsbmV3S2V5d29yZHMpO1xuXG4vKiBNYXAgdG8gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMqL1xuY29uc3QgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0PW1hcEtleXdvcmRzKHBheW1lbnRzLGtleXdvcmRNYXBwaW5nKTtcblxuY29uc3QgdXNlclNlYXRQcm9taXNlPUUoem9lKS5vZmZlcihcbmludml0YXRpb24sXG5wcm9wb3NhbCxcbnBheW1lbnRzRm9yT3RoZXJDb250cmFjdCxcbm9mZmVyQXJncyk7XG5cblxuY29uc3QgZGVwb3NpdGVkUHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuXG5jb25zdCBkb0RlcG9zaXQ9YXN5bmMocGF5b3V0UGF5bWVudHMpPT57XG4vKiBhZnRlciBnZXRQYXlvdXRzKCksIGdldEZpbmFsQWxsb2NhdGlvbigpIHJlc29sdmVzIHByb21wdGx5LiovXG5jb25zdCBhbW91bnRzPWF3YWl0IEUodXNlclNlYXRQcm9taXNlKS5nZXRGaW5hbEFsbG9jYXRpb24oKTtcblxuLyogTWFwIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRyYWN0J3Mga2V5d29yZHMqL1xuY29uc3QgbWFwcGVkQW1vdW50cz1tYXBLZXl3b3JkcyhhbW91bnRzLG1hcHBpbmdSZXZlcnNlZCk7XG5jb25zdCBtYXBwZWRQYXltZW50cz1tYXBLZXl3b3JkcyhwYXlvdXRQYXltZW50cyxtYXBwaW5nUmV2ZXJzZWQpO1xuYXdhaXQgZGVwb3NpdFRvU2VhdCh6Y2YsZGVmaW5lZFRvU2VhdCxtYXBwZWRBbW91bnRzLG1hcHBlZFBheW1lbnRzKTtcbmRlcG9zaXRlZFByb21pc2VLaXQucmVzb2x2ZShtYXBwZWRBbW91bnRzKTtcbiB9O1xuXG5FKHVzZXJTZWF0UHJvbWlzZSkuZ2V0UGF5b3V0cygpLnRoZW4oZG9EZXBvc2l0KTtcblxuLyogVE9ETyByZW5hbWUgcmV0dXJuIGtleTsgdXNlclNlYXRQcm9taXNlIGlzIGEgcmVtb3RlIFVzZXJTZWF0Ki9cbnJldHVybiBoYXJkZW4oe3VzZXJTZWF0UHJvbWlzZSxkZXBvc2l0ZWQ6ZGVwb3NpdGVkUHJvbWlzZUtpdC5wcm9taXNlfSk7XG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSB3cmFwcGVkIHZlcnNpb24gb2YgemNmIHRoYXQgYXNzZXJ0cyBhbiBpbnZhcmlhbnRcbiAqIGJlZm9yZSBwZXJmb3JtaW5nIGEgcmVhbGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7KHNlYXRzOiBaQ0ZTZWF0W10pID0+IHZvaWR9IGFzc2VydEZuIC0gYW4gYXNzZXJ0aW9uXG4gKiB0aGF0IG11c3QgYmUgdHJ1ZSBmb3IgdGhlIHJlYWxsb2NhdGUgdG8gb2NjdXJcbiAqIEByZXR1cm5zIHtaQ0Z9XG4gKi8kaOKAjV9vbmNlLm9mZmVyVG8ob2ZmZXJUbyk7XG5jb25zdCAgICAgICAgY2hlY2taQ0Y9KHpjZixhc3NlcnRGbik9PntcbmNvbnN0IGNoZWNrZWRaQ0Y9aGFyZGVuKHtcbi4uLnpjZixcbnJlYWxsb2NhdGU6KC4uLnNlYXRzKT0+e1xuYXNzZXJ0Rm4oc2VhdHMpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdHlwZXMgYXJlbid0IHJpZ2h0IGZvciBzcHJlYWRpbmcqL1xuemNmLnJlYWxsb2NhdGUoLi4uc2VhdHMpO1xuIH19KTtcblxucmV0dXJuIGNoZWNrZWRaQ0Y7XG4gfTskaOKAjV9vbmNlLmNoZWNrWkNGKGNoZWNrWkNGKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0QWNjZXB0YW5jZU1zZyI6WyJkZWZhdWx0QWNjZXB0YW5jZU1zZyJdLCJhc3NlcnRJc3N1ZXJLZXl3b3JkcyI6WyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyJdLCJzYXRpc2ZpZXMiOlsic2F0aXNmaWVzIl0sInN3YXAiOlsic3dhcCJdLCJzd2FwRXhhY3QiOlsic3dhcEV4YWN0Il0sImZpdFByb3Bvc2FsU2hhcGUiOlsiZml0UHJvcG9zYWxTaGFwZSJdLCJhc3NlcnRQcm9wb3NhbFNoYXBlIjpbImFzc2VydFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0TmF0QXNzZXRLaW5kIjpbImFzc2VydE5hdEFzc2V0S2luZCJdLCJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyI6WyJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyJdLCJkZXBvc2l0VG9TZWF0IjpbImRlcG9zaXRUb1NlYXQiXSwid2l0aGRyYXdGcm9tU2VhdCI6WyJ3aXRoZHJhd0Zyb21TZWF0Il0sInNhdmVBbGxJc3N1ZXJzIjpbInNhdmVBbGxJc3N1ZXJzIl0sIm1hcEtleXdvcmRzIjpbIm1hcEtleXdvcmRzIl0sIm9mZmVyVG8iOlsib2ZmZXJUbyJdLCJjaGVja1pDRiI6WyJjaGVja1pDRiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD6D+1f6xEAAOsRAAAkAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHRyYWNrVHVybnM7JGjigI1faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLCBbJGjigI1fYSA9PiAodHJhY2tUdXJucyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qLyA8cmVmZXJlbmNlIHBhdGg9XCJpbmRleC5kLnRzXCIgLz4qL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gRVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuaWYodGhpcyE9PXJlY2VpdmVyKXtcbi8qIFJlamVjdCB0aGUgYXN5bmMgZnVuY3Rpb24gY2FsbCovXG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuYXNzZXJ0LmVycm9yKFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3B9XCIgbWV0aG9kIG9mIEUoJHtxKHgpfSlgKSk7XG5cblxuIH1cblxucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHgscCxhcmdzKTtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSl7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbih4LGFyZ0FycmF5KTtcbiB9LFxuaGFzKF90YXJnZXQsX3Ape1xuLyogV2UganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLnNlbmRPbmx5KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gRXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2Upe1xucmV0dXJuIGhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0KF90YXJnZXQscCxyZWNlaXZlcil7XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG4vKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbmFzc2VydC5lcXVhbChcbnRoaXMsXG5yZWNlaXZlcixcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cSh4KX0pYCk7XG5cbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkoeCxwLGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxhcmdzQXJyYXk9W10pe1xuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHgsYXJnc0FycmF5KTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL2luZGV4JykuRVByb3h5fVxuICovXG5mdW5jdGlvbiAgICAgICAgICAgICAgICBtYWtlRShIYW5kbGVkUHJvbWlzZSl7XG5mdW5jdGlvbiBFKHgpe1xuY29uc3QgaGFuZGxlcj1FUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfVxuXG5jb25zdCBtYWtlRUdldHRlclByb3h5PSh4KT0+XG5uZXcgUHJveHkoT2JqZWN0LmNyZWF0ZShudWxsKSx7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuaGFzKF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIHRydWU7XG4gfSxcbmdldChfdGFyZ2V0LHByb3Ape1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApO1xuIH19KTtcblxuXG5FLmdldD1tYWtlRUdldHRlclByb3h5O1xuRS5yZXNvbHZlPUhhbmRsZWRQcm9taXNlLnJlc29sdmU7XG5FLnNlbmRPbmx5PSh4KT0+e1xuY29uc3QgaGFuZGxlcj1Fc2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LGhhbmRsZXIpKTtcbiB9O1xuXG5FLndoZW49KHgsb25mdWxmaWxsZWQsb25yZWplY3RlZCk9PntcbmNvbnN0W29uc3VjY2VzcyxvbmZhaWx1cmVdPXRyYWNrVHVybnMoW29uZnVsZmlsbGVkLG9ucmVqZWN0ZWRdKTtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ob25zdWNjZXNzLG9uZmFpbHVyZSk7XG4gfTtcblxucmV0dXJuIGhhcmRlbihFKTtcbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgbWFrZUUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACi1JzLCgIAAAoCAAAqAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRTskaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKG1ha2VFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3QgaHA9SGFuZGxlZFByb21pc2U7JGjigI1fb25jZS5ocChocCk7XG5jb25zdCAgICAgICAgRT1tYWtlRShIYW5kbGVkUHJvbWlzZSk7JGjigI1fb25jZS5FKEUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtbm9jaGVjayovXG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFgsIEZhaWwgfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG4vKiBUT0RPIFVzZSBlbnZpcm9ubWVudC1vcHRpb25zLmpzIGN1cnJlbnRseSBpbiBzZXMvc3JjIGFmdGVyIGZhY3RvcmluZyBpdCBvdXQqL1xuLyogdG8gYSBuZXcgcGFja2FnZS4qL1xuY29uc3QgZW52PShnbG9iYWxUaGlzLnByb2Nlc3N8fHt9KS5lbnZ8fHt9O1xuXG4vKiBUdXJuIG9uIGlmIHlvdSBzZWVtIHRvIGJlIGxvc2luZyBlcnJvciBsb2dnaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGV2ZW50IGxvb3AqL1xuY29uc3QgVkVSQk9TRT0oZW52LkRFQlVHfHwnJykuc3BsaXQoJzonKS5pbmNsdWRlcygndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiBXZSBpbnRlbmQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGFmdGVyIHZlcmlmeWluZyB0aGF0IGhhdmluZyovXG4vKiB0aGUgZmVhdHVyZSBlbmFibGVkIGluIHByb2R1Y3Rpb24gZG9lcyBub3QgY2F1c2UgbWVtb3J5IHRvIGxlYWsuKi9cbmNvbnN0IEVOQUJMRUQ9ZW52LlRSQUNLX1RVUk5TPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGVzZSBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlPShkZXRhaWxzTm90ZSk9PihyZWFzb24pPT57XG5pZihyZWFzb24gaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249KGZ1bmMsc2VuZGluZ0Vycm9yLFgpPT4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIGhhcmRlbihyZXN1bHQpO1xuIH1maW5hbGx5e1xuaGlkZGVuUHJpb3JFcnJvcj11bmRlZmluZWQ7XG4gfVxuIH07XG5cbi8qKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIHRyYWNrVHVybnM9KGZ1bmNzKT0+e1xuaWYoIUVOQUJMRUR8fHR5cGVvZiBnbG9iYWxUaGlzPT09J3VuZGVmaW5lZCd8fCFnbG9iYWxUaGlzLmFzc2VydCl7XG5yZXR1cm4gZnVuY3M7XG4gfVxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmhpZGRlbkN1cnJlbnRFdmVudCs9MTtcbmNvbnN0IHNlbmRpbmdFcnJvcj1uZXcgRXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQubm90ZShzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gZnVuY3MubWFwKChmdW5jKT0+ZnVuYyYmd3JhcEZ1bmN0aW9uKGZ1bmMsc2VuZGluZ0Vycm9yLFgpKTtcbiB9OyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhNaH8L8QAAC/EAAAHQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiLCIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlBBU1NfU1RZTEUiLCJRQ0xBU1MiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIiwiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiZGVjb2RlVG9KdXN0aW4iLCJkZWVwbHlGdWxmaWxsZWQiLCJmaWx0ZXJJdGVyYWJsZSIsImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRJbnRlcmZhY2VPZiIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc0NvcHlBcnJheSIsImlzT2JqZWN0IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSIsIm1ha2VNYXJzaGFsIiwibWFrZVRhZ2dlZCIsIm1hcEl0ZXJhYmxlIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFyc2UiLCJwYXNzU3R5bGVPZiIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInN0cmluZ2lmeSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1wiLCBbW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJtYXBJdGVyYWJsZVwiXV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wiZmlsdGVySXRlcmFibGVcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2xpdmVbXCJQQVNTX1NUWUxFXCJdXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2xpdmVbXCJpc09iamVjdFwiXV1dLFtcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDaGVja2VyXCJdXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9saXZlW1wiZ2V0VGFnXCJdXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fbGl2ZVtcImhhc093blByb3BlcnR5T2ZcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2xpdmVbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCJdXV0sW1widG9QYXNzYWJsZUVycm9yXCIsIFskaOKAjV9saXZlW1widG9QYXNzYWJsZUVycm9yXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2xpdmVbXCJnZXRJbnRlcmZhY2VPZlwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fbGl2ZVtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiXV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fbGl2ZVtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiXV1dXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9saXZlW1wicGFzc1N0eWxlT2ZcIl1dXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhc3NhYmxlXCJdXV1dXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fbGl2ZVtcImRlZXBseUZ1bGZpbGxlZFwiXV1dXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VUYWdnZWRcIl1dXV1dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtbXCJSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJSZW1vdGFibGVcIl1dXSxbXCJGYXJcIiwgWyRo4oCNX2xpdmVbXCJGYXJcIl1dXSxbXCJUb0ZhckZ1bmN0aW9uXCIsIFskaOKAjV9saXZlW1wiVG9GYXJGdW5jdGlvblwiXV1dXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2xpdmVbXCJRQ0xBU1NcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9saXZlW1wibWFrZU1hcnNoYWxcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtbXCJzdHJpbmdpZnlcIiwgWyRo4oCNX2xpdmVbXCJzdHJpbmdpZnlcIl1dXSxbXCJwYXJzZVwiLCBbJGjigI1fbGl2ZVtcInBhcnNlXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbW1wiZGVjb2RlVG9KdXN0aW5cIiwgWyRo4oCNX2xpdmVbXCJkZWNvZGVUb0p1c3RpblwiXV1dXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UmVjb3JkXCJdXV0sW1wiYXNzZXJ0Q29weUFycmF5XCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0Q29weUFycmF5XCJdXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UmVtb3RhYmxlXCJdXV0sW1wiaXNSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJpc1JlbW90YWJsZVwiXV1dLFtcImlzUmVjb3JkXCIsIFskaOKAjV9saXZlW1wiaXNSZWNvcmRcIl1dXSxbXCJpc0NvcHlBcnJheVwiLCBbJGjigI1fbGl2ZVtcImlzQ29weUFycmF5XCJdXV1dXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSIsZmFsc2VdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSIsZmFsc2VdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiLGZhbHNlXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiLGZhbHNlXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIixmYWxzZV0sImdldFRhZyI6WyJnZXRUYWciLGZhbHNlXSwiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIixmYWxzZV0sImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsZmFsc2VdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIixmYWxzZV0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIixmYWxzZV0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLGZhbHNlXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsZmFsc2VdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiIsZmFsc2VdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSIsZmFsc2VdLCJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIixmYWxzZV0sIm1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCIsZmFsc2VdLCJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIixmYWxzZV0sIkZhciI6WyJGYXIiLGZhbHNlXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIixmYWxzZV0sIlFDTEFTUyI6WyJRQ0xBU1MiLGZhbHNlXSwibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiLGZhbHNlXSwic3RyaW5naWZ5IjpbInN0cmluZ2lmeSIsZmFsc2VdLCJwYXJzZSI6WyJwYXJzZSIsZmFsc2VdLCJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiIsZmFsc2VdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIixmYWxzZV0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiLGZhbHNlXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSIsZmFsc2VdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSIsZmFsc2VdLCJpc1JlY29yZCI6WyJpc1JlY29yZCIsZmFsc2VdLCJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGVpdGhlciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLCBvciBhIHByb21pc2UgZm9yIHRoYXRcbiAqIHJlcGxhY2VtZW50LCB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IHBhc3NhYmxlcyAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge0VSZWY8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPSh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMMCGcApAAAAKQAAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLEVycm9ySGVscGVyLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ1VuaW9ufSBFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUz0nQHFjbGFzcyc7JGjigI1fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IGVuY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb0NhcERhdGE9KHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT1kb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT1kb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhPWRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YX09XG57fSk9Pntcbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRldGx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvQ2FwRGF0YWAgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb0NhcERhdGFgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBhcyBbUUNMQVNTXSBjb21wb3NpdGVzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm57W1FDTEFTU106J3VuZGVmaW5lZCd9O1xuIH1cbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfVxuaWYoaXMocGFzc2FibGUsLTApKXtcbnJldHVybiAwO1xuIH1cbmlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1cbmlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gZGVjb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbnt9KT0+e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YoXG5xY2xhc3MsXG4nc3RyaW5nJyxcblggYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YCk7XG5cbnN3aXRjaChxY2xhc3Mpe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmNhc2UnYmlnaW50Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7ZGlnaXRzfT1qc29uRW5jb2RlZDtcbmFzc2VydC50eXBlb2YoXG5kaWdpdHMsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YCk7XG5cbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4vKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuLyoqL1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuY2FzZSdzbG90Jzp7XG4vKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbi8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4vKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbi8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbi8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbi8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtvcmlnaW5hbCxyZXN0fT1qc29uRW5jb2RlZDtcbmhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ29yaWdpbmFsJyl8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuY29uc3QgaXNOb25FbXB0eU9iamVjdD1cbnR5cGVvZiByZXN0PT09J29iamVjdCcmJlxucmVzdCE9PW51bGwmJlxub3duS2V5cyhyZXN0KS5sZW5ndGg+PTE7XG5pc05vbkVtcHR5T2JqZWN0fHxcbkZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbi8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuIWhhc093blByb3BlcnR5T2YocmVzdE9iaixRQ0xBU1MpfHxcbkZhaWwgYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbmRlZmluZVByb3BlcnRpZXMocmVzdWx0LGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbmNhc2UnaWJpZCc6e1xudGhyb3cgRmFpbCBgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG5xY2xhc3MpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2V7XG5hc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkPT09J29iamVjdCcmJmpzb25FbmNvZGVkIT09bnVsbCk7XG5jb25zdCBkZWNvZGVFbnRyeT0oW25hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwBoMIXk9AAB5PQAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLEVycm9ySGVscGVyLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nfSBTbWFsbGNhcHNFbmNvZGluZyAqWC8qL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ1VuaW9ufSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICpYLyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2lzLGVudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgQkFORz0nIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0g9Jy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbD0oZW5jb2RlZFN0cik9PntcbmlmKGVuY29kZWRTdHI9PT0nJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG5jb25zdCBjb2RlPWVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbnJldHVybiBCQU5HPD1jb2RlJiZjb2RlPD1EQVNIO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW0pPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycik9PlxuRmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IGVuY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbnt9KT0+e1xuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIFNtYWxsY2Fwc0VuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmVcbiAqIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRldGx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKXtcbi8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbi8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4vKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4vKiBwcmVzZXJ2aW5nLiovXG5yZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gfVxuLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBBdCB0aGUgc21hbGxjYXBzIGxldmVsLCB3ZSBwcmVmaXggc3ltYm9sIG5hbWVzIHdpdGggYCVgLiovXG4vKiBCeSBcInN5bWJvbCBuYW1lXCIsIHdlIG1lYW4gYWNjb3JkaW5nIHRvIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgKi9cbi8qIHdoaWNoIGRvZXMgc29tZSBmdXJ0aGVyIGVzY2FwaW5nLiBTZWUgY29tbWVudCBvbiB0aGF0IGZ1bmN0aW9uLiovXG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm4gYCUke25hbWV9YDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJyN1bmRlZmluZWQnO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9XG5pZihpcyhwYXNzYWJsZSwtMCkpe1xucmV0dXJuIDA7XG4gfVxuaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm4nI0luZmluaXR5JztcbiB9XG5pZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm4nIy1JbmZpbml0eSc7XG4gfVxuLyogQWxsIG90aGVyIG51bWJlcnMgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiBwYXNzYWJsZTwwbj9zdHI6IGArJHtzdHJ9YDtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbicjdGFnJzplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxucGF5bG9hZDplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCckJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCcmJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YocmVzdWx0LCcjZXJyb3InKSl7XG5jb25zdCBtZXNzYWdlPXJlc3VsdFsnI2Vycm9yJ107XG5pZihcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbi8qIGNoZWNrIHRoYXQgaXQgZGVjb2RlcyB0byBhIHN0cmluZyovXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpKVxue1xucmV0dXJuIHJlc3VsdDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EoXG5tZXNzYWdlKVxuIH1gO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxucmVzdWx0KVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKHJlc3VsdCwnI2Vycm9yJykpe1xuY29uc3QgbWVzc2FnZT1yZXN1bHRbJyNlcnJvciddO1xuaWYoXG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4vKiBjaGVjayB0aGF0IGl0IGRlY29kZXMgdG8gYSBzdHJpbmcqL1xuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKSlcbntcbnJldHVybiByZXN1bHQ7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKHJlc3VsdCl9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gZGVjb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbnt9KT0+e1xuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9XG5jYXNlJysnOntcbnJldHVybiBCaWdJbnQoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnLSc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gfVxuY2FzZSckJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncmVtb3RhYmxlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJyYnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncHJvbWlzZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFNwZWNpYWwgY2hhciAke3EoXG5jKVxuIH0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZChcbmRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbmRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCkpO1xuXG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKSl7XG5jb25zdCByZXN1bHQ9ZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxucGFzc1N0eWxlT2YocmVzdWx0KT09PSdlcnJvcid8fFxuRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgZGVjb2RlRW50cnk9KFtlbmNvZGVkTmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBlbmNvZGVkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxuZW5jb2RlZE5hbWUpXG4gfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiFlbmNvZGVkTmFtZS5zdGFydHNXaXRoKCcjJyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG5jb25zdCBuYW1lPWRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbnR5cGVvZiBlbmNvZGluZylcbiB9OiAke2VuY29kaW5nfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmyhdk6AYAAOgGAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheSxwcm90b3R5cGU6YXJyYXlQcm90b3R5cGV9PUFycmF5O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlBcnJheUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5QXJyYXknLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlBcnJheUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk9PT1hcnJheVByb3RvdHlwZXx8XG5hc3NlcnQuZmFpbChYIGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdCB0byBmYWlsKi9cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdsZW5ndGgnLGZhbHNlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgbGVuPWNhbmRpZGF0ZS5sZW5ndGg7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLGksdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiArMSBmb3IgdGhlICdsZW5ndGgnIHByb3BlcnR5IGl0c2VsZi4qL1xub3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aD09PWxlbisxfHxcbmFzc2VydC5mYWlsKFggYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5jYW5kaWRhdGUuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk4cFYdMHAADTBwAALgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsdmFsdWVzLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5UmVjb3JkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlSZWNvcmQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5mb3IoY29uc3Qga2V5IG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jb25zdCB2YWxpZD1cbih0eXBlb2Yga2V5PT09J3N0cmluZyd8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuWCBgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkmJihcblxuIWNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG4hIXJlamVjdCYmXG5yZWplY3QoXG4vKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cblggYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpO1xuXG5pZighdmFsaWQpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5UmVjb3JkSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLG5hbWUsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG52YWx1ZXMoY2FuZGlkYXRlKS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADJmk2mARAABgEQAAKQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgY2FuQmVWYWxpZGAgc28gbWFyc2hhbCBjYW4gdXNlIHRoaXMgZm9yIHRvcCBsZXZlbCBlcnJvciB0byByZXBvcnQgZnJvbSxcbiAqIGV2ZW4gaWYgaXQgd291bGQgbm90IGFjdHVhbGx5IHZhbGlkYXRlLlxuICogSW5zdGVhZCwgdGhlIGRpYWdub3N0aWNzIHRoYXQgYGFzc2VydEVycm9yYCB3b3VsZCBoYXZlIHJlcG9ydGVkIGFyZVxuICogYXR0YWNoZWQgYXMgbm90ZXMgdG8gdGhlIG1hbGZvcm1lZCBlcnJvci4gVGh1cywgYSBtYWxmb3JtZWRcbiAqIGVycm9yIGlzIHBhc3NhYmxlIGJ5IGl0c2VsZiwgYnV0IG5vdCBhcyBwYXJ0IG9mIGEgcGFzc2FibGUgc3RydWN0dXJlLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG4vKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbmlmKCEoY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG4gfVxuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbmlmKCFFQ3x8RUMucHJvdG90eXBlIT09cHJvdG8pe1xuY29uc3Qgbm90ZT1YIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cblxuY29uc3R7XG4vKiBNdXN0IGFsbG93IGBjYXVzZWAsIGBlcnJvcnNgKi9cbm1lc3NhZ2U6bURlc2MsXG4vKiBBbGxvdyBidXQgaWdub3JlIG9ubHkgZXh0cmFuZW91cyBvd24gYHN0YWNrYCBwcm9wZXJ0eS4qL1xuc3RhY2s6X29wdFN0YWNrRGVzYyxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPj0xKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0aWVzICR7cmVzdERlc2NzfWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuaWYobURlc2Mpe1xuaWYodHlwZW9mIG1EZXNjLnZhbHVlIT09J3N0cmluZycpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbmlmKG1EZXNjLmVudW1lcmFibGUpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT57XG5FcnJvckhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbiB9fSk7XG5cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljIGluZm8gb2YgdGhlXG4gKiBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovJGjigI1fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG5jb25zdCAgICAgICAgdG9QYXNzYWJsZUVycm9yPShlcnIpPT57XG5jb25zdHtuYW1lLG1lc3NhZ2V9PWVycjtcblxuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1oYXJkZW4obmV3IEVDKCBgJHttZXNzYWdlfWApKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFzc2VydC5ub3RlKG5ld0Vycm9yLFggYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xucmV0dXJuIG5ld0Vycm9yO1xuIH07JGjigI1fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANExutlGCAAARggAADAAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCIuLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAwC6if0GQAA9BkAADUAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja05vcm1hbFByb3BlcnR5IiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuZ2V0UHJvdG90eXBlT2YsXG5oYXNPd25Qcm9wZXJ0eTpvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnOnRvU3RyaW5nVGFnU3ltYm9sfT1TeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGU9Z2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG50eXBlZEFycmF5UHJvdG90eXBlLFxudG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9dHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz09PSdmdW5jdGlvbicpO1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRo4oCNX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCAgICAgICAgUEFTU19TVFlMRT1TeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRo4oCNX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrTm9ybWFsUHJvcGVydHk9KFxuY2FuZGlkYXRlLFxucHJvcGVydHlOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgJHtxKHByb3BlcnR5TmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApOlxuXG4hZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjigI1fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCAgICAgICAgY2hlY2tQYXNzU3R5bGU9KG9iaixleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBhY3R1YWw9b2JqW1BBU1NfU1RZTEVdO1xucmV0dXJuKFxuYWN0dWFsPT09ZXhwZWN0ZWRQYXNzU3R5bGV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCkpO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZD0oY2hlY2tQcm90byk9Pntcbi8qKlxuICogQHBhcmFtIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nIH19IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxQQVNTX1NUWUxFLGZhbHNlLGNoZWNrKSYmXG5jaGVja1Bhc3NTdHlsZSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spJiYoXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkmJlxuXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sImNoZWNrTm9ybWFsUHJvcGVydHkiOlsiY2hlY2tOb3JtYWxQcm9wZXJ0eSJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAE8mw+9h8AAPYfAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuTWFyc2hhbEdldEludGVyZmFjZU9mfSBNYXJzaGFsR2V0SW50ZXJmYWNlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlPShpZmFjZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4vKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkmJihcblxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiOyB1bmltcGxlbWVudGVkYCkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZj0ob3JpZ2luYWwsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbi8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbi8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4vKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbi8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbi8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4vKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuLyoqL1xuLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbi8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbi8qIH19Ki9cbi8qKi9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKHByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxwcm90bz09PW51bGwpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKSk7XG5cbiB9XG5cbmlmKHR5cGVvZiBvcmlnaW5hbD09PSdvYmplY3QnKXtcbmNvbnN0IHByb3RvUHJvdG89Z2V0UHJvdG90eXBlT2YocHJvdG8pO1xuaWYocHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmcHJvdG9Qcm90byE9PW51bGwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlbW90YWJsZShwcm90byxjaGVjayk7XG4gfVxuaWYoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1lbHNlIGlmKHR5cGVvZiBvcmlnaW5hbD09PSdmdW5jdGlvbicpe1xuaWYoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06e3ZhbHVlOmlmYWNlfSxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxucmV0dXJuKFxuKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSYmXG5cbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlPn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5pZihjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXJzaGFsR2V0SW50ZXJmYWNlT2Z9ICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzT2JqZWN0KGNhbmRpZGF0ZSkpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9ZWxzZSBpZihpc0FycmF5KGNhbmRpZGF0ZSkpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4vKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xuY29uc3Qga2V5cz1vd25LZXlzKGRlc2NzKTtcbnJldHVybiBrZXlzLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4oaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi9rZXldLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5jYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4vKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbmNvbnN0e25hbWU6bmFtZURlc2MsbGVuZ3RoOmxlbmd0aERlc2MsLi4ucmVzdERlc2NzfT1kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChYIGBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSkpO1xuXG5cbiB9ZWxzZXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH1cbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+Y2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpLFxuXG5ldmVyeTooX3Bhc3NhYmxlLF9mbik9PnRydWV9KTskaOKAjV9vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFMaqwYoPAACKDwAAMAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzRnJvemVuLGdldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YCk7XG5cbiB9XG5cbi8qKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIGFsc28gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVBc3luY0hvb2tzS2V5PShrZXkpPT57XG5jb25zdCB2YWw9cHJba2V5XTtcbmlmKHZhbD09PXVuZGVmaW5lZHx8dHlwZW9mIHZhbD09PSdudW1iZXInKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKFxudHlwZW9mIHZhbD09PSdvYmplY3QnJiZcbnZhbCE9PW51bGwmJlxuaXNGcm96ZW4odmFsKSYmXG5nZXRQcm90b3R5cGVPZih2YWwpPT09T2JqZWN0LnByb3RvdHlwZSlcbntcbmNvbnN0IHN1YktleXM9b3duS2V5cyh2YWwpO1xuaWYoc3ViS2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuaWYoXG5zdWJLZXlzLmxlbmd0aD09PTEmJlxuc3ViS2V5c1swXT09PSdkZXN0cm95ZWQnJiZcbnZhbC5kZXN0cm95ZWQ9PT1mYWxzZSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gcmVqZWN0KFxuWCBgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGlzICR7dmFsfWApO1xuXG4gfTtcblxucmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlQXN5bmNIb29rc0tleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkpJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QoXG5YIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApKSYmXG5cbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZRP9aLkSAAC5EgAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3N5bWJvbC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQXRBdFByZWZpeFBhdHRlcm4iLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvOyRo4oCNX29uY2UuQXRBdFByZWZpeFBhdHRlcm4oQXRBdFByZWZpeFBhdHRlcm4pO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbD19XG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5GYWlsIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiB9XG4gfVxucmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG4gfTskaOKAjV9vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwiQXRBdFByZWZpeFBhdHRlcm4iOlsiQXRBdFByZWZpeFBhdHRlcm4iXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKtLnW4AcAAOAHAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGNoZWNrTm9ybWFsUHJvcGVydHksY2hlY2tQYXNzU3R5bGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjigI1fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFRhZ2dlZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOid0YWdnZWQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT5jaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsJ3RhZ2dlZCcsY2hlY2spLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsJ3RhZ2dlZCcsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTpfbGFiZWxEZXNjLFxucGF5bG9hZDpfcGF5bG9hZERlc2MsLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5GYWlsIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwncGF5bG9hZCcsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcblxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xucGFzc1N0eWxlT2ZSZWN1cihjYW5kaWRhdGUucGF5bG9hZCk7XG4gfX0pOyRo4oCNX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAARmjtQ9BgAAPQYAAAkAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRJZmFjZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlPSdSZW1vdGFibGUnXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZSBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldFxuICogaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldCBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzPXVuZGVmaW5lZF0gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZT0oXG5pZmFjZT0nUmVtb3RhYmxlJyxcbnByb3BzPXVuZGVmaW5lZCxcbnJlbW90YWJsZT0vKiogQHR5cGUge1R9ICove30pPT5cbntcbmFzc2VydElmYWNlKGlmYWNlKTtcbmFzc2VydChpZmFjZSk7XG4vKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG5wcm9wcz09PXVuZGVmaW5lZHx8RmFpbCBgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxucmVtb3RhYmxlW1BBU1NfU1RZTEVdKVxuIH1gO1xuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fEZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIEEgY29uY2lzZSBjb252ZW5pZW5jZSBmb3IgdGhlIG1vc3QgY29tbW9uIGBSZW1vdGFibGVgIHVzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaOKAjV9vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IGZ1bmNcbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jO1xuIH1cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjigI1fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAW/MDZykEAAApBAAAJgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRhZ2dlZD0odGFnLHBheWxvYWQpPT57XG5hc3NlcnQudHlwZW9mKFxudGFnLFxuJ3N0cmluZycsXG5YIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gKTtcblxuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADQJQ6LvCgAALwoAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxRQ0xBU1MsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxBdEF0UHJlZml4UGF0dGVybixwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIkF0QXRQcmVmaXhQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChBdEF0UHJlZml4UGF0dGVybiA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5sZXQgbGV2ZWw9MDtcbmxldCBuZWVkU3BhY2U9ZmFsc2U7XG5jb25zdCBsaW5lPSgpPT57XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCcgICcucmVwZWF0KGxldmVsKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT57XG5sZXZlbCs9MTtcbmlmKG5lZWRTcGFjZSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiB9LFxubGluZSxcbm5leHQ6KHRva2VuKT0+e1xuaWYobmVlZFNwYWNlJiZ0b2tlbiE9PScsJyl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9dHJ1ZTtcbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuYXNzZXJ0KGxldmVsPj0xKTtcbmxldmVsLT0xO1xubGluZSgpO1xucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT57XG5hc3NlcnQuZXF1YWwobGV2ZWwsMCk7XG5yZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuPS9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3Rpbj0oZW5jb2Rpbmcsc2hvdWxkSW5kZW50PWZhbHNlKT0+e1xuLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHByZXBhcmU9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xucmV0dXJuO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihcbnFjbGFzcyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gKTtcblxuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKFxuZGlnaXRzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWApO1xuXG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKFxucmVzdCxcbidvYmplY3QnLFxuWCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YCk7XG5cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG4haXNBcnJheShyZXN0KXx8RmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiEoUUNMQVNTIGluIHJlc3QpfHxcbkZhaWwgYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YCk7XG5cbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbmFzc2VydC50eXBlb2YoXG5tZXNzYWdlLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YCk7XG5cbnJldHVybjtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5wcmVwYXJlKHJhd1RyZWVbaV0pO1xuIH1cbiB9ZWxzZXtcbmNvbnN0IG5hbWVzPW93bktleXMocmF3VHJlZSk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5jb25zdCBvdXQ9bWFrZUluZGVudGVyKCk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGU9KHJhd1RyZWUpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuIH07XG5cbmNvbnN0IGRlY29kZVByb3BlcnR5PShuYW1lLHZhbHVlKT0+e1xub3V0LmxpbmUoKTtcbmlmKG5hbWU9PT0nX19wcm90b19fJyl7XG4vKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbi8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4vKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4vKiBKU09OIG1lYW5pbmcuKi9cbm91dC5uZXh0KCBgW1wiX19wcm90b19fXCJdOmApO1xuIH1lbHNlIGlmKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKXtcbm91dC5uZXh0KCBgJHtuYW1lfTpgKTtcbiB9ZWxzZXtcbm91dC5uZXh0KCBgJHtxdW90ZShuYW1lKX06YCk7XG4gfVxuZGVjb2RlKHZhbHVlKTtcbm91dC5uZXh0KCcsJyk7XG4gfTtcblxuLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmVjdXI9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xuLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbnJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKHFjbGFzcywnc3RyaW5nJyk7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4vKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuLyogZWFybGllci4qL1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xuLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG5yZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbnJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmluZGV4PU51bWJlcihOYXQoaW5kZXgpKTtcbmlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfWVsc2V7XG5pZmFjZT1xdW90ZShpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuIH1cbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgnW10nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCdbJyk7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbm91dC5saW5lKCk7XG5kZWNvZGUocmF3VHJlZVtpXSk7XG5vdXQubmV4dCgnLCcpO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiB9XG4gfWVsc2V7XG4vKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbi8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG5jb25zdCBuYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRo4oCNX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAy15NFwwYAAMMGAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VNYXJzaGFsOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRo4oCNX29uY2UucGFyc2UocGFyc2UpO1xuXG5cbmhhcmRlbihwYXJzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABp3935VTIAAFUyAAAjAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaOKAjV9hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1ha2VNYXJzaGFsT3B0aW9uc30gTWFrZU1hcnNoYWxPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBDb252ZXJ0U2xvdFRvVmFsICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBDb252ZXJ0VmFsVG9TbG90ICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TZXJpYWxpemU8U2xvdD59IFNlcmlhbGl6ZSAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5zZXJpYWxpemU8U2xvdD59IFVuc2VyaWFsaXplICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7U2VyaWFsaXplPFNsb3Q+fVxuICovXG5jb25zdCBzZXJpYWxpemU9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZSB8IFByb21pc2V9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIEVycm9ySGVscGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLiovXG4vKiBuZXN0ZWQgbm9uLXBhc3NhYmxlIGVycm9ycyBtdXN0IGJlIG9rIGZyb20gaGVyZS4qL1xuaWYoZXJyb3JUYWdnaW5nPT09J29uJyl7XG4vKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbi8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbi8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4vKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbi8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbi8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbmNvbnN0IGVycm9ySWQ9ZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG5hc3NlcnQudHlwZW9mKGVycm9ySWQsJ3N0cmluZycpO1xuYXNzZXJ0Lm5vdGUoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBFcnJvckhlbHBlci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlciwgUGFzc2FibGU+fSAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmlmKHZhbE1hcC5oYXMoaW5kZXgpKXtcbnJldHVybiB2YWxNYXAuZ2V0KGluZGV4KTtcbiB9XG4vKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4vKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCBkZWNvZGVFcnJvckNvbW1vbj0oZXJyRGF0YSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e2Vycm9ySWQ9dW5kZWZpbmVkLG1lc3NhZ2UsbmFtZSwuLi5yZXN0fT1lcnJEYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuLyogVE9ETyBNdXN0IGRlY29kZSBgY2F1c2VgIGFuZCBgZXJyb3JzYCBwcm9wZXJ0aWVzKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBjYWxscyB0byBgZGVjb2RlUmVjdXJgKi9cbi8qIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuY29uc3QgZEVycm9ySWQ9ZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG50eXBlb2YgZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG50eXBlb2YgZE1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKXx8RXJyb3I7XG4vKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7RUMubmFtZX1gOlxuIGBSZW1vdGUke0VDLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBlcnJvcj1hc3NlcnQuZXJyb3IoZE1lc3NhZ2UsRUMse2Vycm9yTmFtZX0pO1xucmV0dXJuIGhhcmRlbihlcnJvcik7XG4gfTtcblxuLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4vKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5zdGFydHNXaXRoKHByZWZpeCkpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtVbnNlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3QgdW5zZXJpYWxpemU9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnNlcmlhbGl6ZSxcbnVuc2VyaWFsaXplfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEFns3kCHAAAAhwAACcAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2NvcHlBcnJheS5qcyIsIi4vaGVscGVycy9jb3B5UmVjb3JkLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vaGVscGVycy9zYWZlLXByb21pc2UuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9oZWxwZXJzL3RhZ2dlZC5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGUiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2hlbHBlcnMvaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IFBhc3NTdHlsZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmltaXRpdmVTdHlsZX0gUHJpbWl0aXZlU3R5bGUgKi9cblxuLyoqIEB0eXBlZGVmIHtFeGNsdWRlPFBhc3NTdHlsZSwgUHJpbWl0aXZlU3R5bGUgfCBcInByb21pc2VcIj59IEhlbHBlclBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPiB9XG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuLyoqIEB0eXBlIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBhbnk+ICYge19fcHJvdG9fXzogbnVsbH19ICovXG5jb25zdCBIZWxwZXJUYWJsZT17XG5fX3Byb3RvX186bnVsbCxcbmNvcHlBcnJheTp1bmRlZmluZWQsXG5jb3B5UmVjb3JkOnVuZGVmaW5lZCxcbnRhZ2dlZDp1bmRlZmluZWQsXG5lcnJvcjp1bmRlZmluZWQsXG5yZW1vdGFibGU6dW5kZWZpbmVkfTtcblxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmNvbnN0e3N0eWxlTmFtZX09aGVscGVyO1xuc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlfHxGYWlsIGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT09PXVuZGVmaW5lZHx8XG5GYWlsIGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT1oZWxwZXI7XG4gfVxuZm9yKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSl7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdIT09dW5kZWZpbmVkfHxcbkZhaWwgYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuIH1cblxucmV0dXJuIGhhcmRlbihIZWxwZXJUYWJsZSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuY29uc3QgSGVscGVyVGFibGU9bWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuY29uc3QgcmVtb3RhYmxlSGVscGVyPUhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFBhc3NhYmxlLCBQYXNzU3R5bGU+fVxuICovXG5jb25zdCBwYXNzU3R5bGVNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZj0ocGFzc2FibGUpPT57XG4vKiBFdmVuIHdoZW4gYSBXZWFrU2V0IGlzIGNvcnJlY3QsIHdoZW4gdGhlIHNldCBoYXMgYSBzaG9ydGVyIGxpZmV0aW1lKi9cbi8qIHRoYW4gaXRzIGtleXMsIHdlIHByZWZlciBhIFNldCBkdWUgdG8gZXhwZWN0ZWQgaW1wbGVtZW50YXRpb24qL1xuLyogdHJhZGVvZmZzLiovXG5jb25zdCBpblByb2dyZXNzPW5ldyBTZXQoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mUmVjdXI9KGlubmVyKT0+e1xuY29uc3QgaW5uZXJJc09iamVjdD1pc09iamVjdChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbmlmKHBhc3NTdHlsZU1lbW8uaGFzKGlubmVyKSl7XG4vKiBAdHMtaWdub3JlIFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgYGdldGAgYWZ0ZXIgYGhhc2AgaXMgc2FmZSovXG5yZXR1cm4gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuIH1cbiFpblByb2dyZXNzLmhhcyhpbm5lcil8fFxuRmFpbCBgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG5pblByb2dyZXNzLmFkZChpbm5lcik7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xucGFzc1N0eWxlTWVtby5zZXQoaW5uZXIscGFzc1N0eWxlKTtcbmluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiB9XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZkludGVybmFsPShpbm5lcik9PntcbmNvbnN0IHR5cGVzdHI9dHlwZW9mIGlubmVyO1xuc3dpdGNoKHR5cGVzdHIpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gdHlwZXN0cjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xucmV0dXJuJ3N5bWJvbCc7XG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGlubmVyPT09bnVsbCl7XG5yZXR1cm4nbnVsbCc7XG4gfVxuaWYoIWlzRnJvemVuKGlubmVyKSl7XG5hc3NlcnQuZmFpbChcbi8qIFR5cGVkQXJyYXlzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBoYXJkZW4oKSovXG4vKiBhbmQgYSBjb3JyZXNwb25kaW5nIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBoZXJlLiovXG5pc1R5cGVkQXJyYXkoaW5uZXIpP1xuWCBgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gOlxuWCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWApO1xuXG4gfVxuaWYoaXNQcm9taXNlKGlubmVyKSl7XG5hc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG5yZXR1cm4ncHJvbWlzZSc7XG4gfVxudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5jb25zdCBwYXNzU3R5bGVUYWc9aW5uZXJbUEFTU19TVFlMRV07XG5pZihwYXNzU3R5bGVUYWchPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsJ3N0cmluZycpO1xuY29uc3QgaGVscGVyPUhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG5oZWxwZXIhPT11bmRlZmluZWR8fFxuRmFpbCBgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiAoLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovcGFzc1N0eWxlVGFnKTtcbiB9XG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuaWYoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKXtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuIH1cbiB9XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5jYXNlJ2Z1bmN0aW9uJzp7XG5pc0Zyb3plbihpbm5lcil8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9O1xuXG5yZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gfTtcbnJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xuIH07XG5cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1tYWtlUGFzc1N0eWxlT2YoW1xuQ29weUFycmF5SGVscGVyLFxuQ29weVJlY29yZEhlbHBlcixcblRhZ2dlZEhlbHBlcixcbkVycm9ySGVscGVyLFxuUmVtb3RhYmxlSGVscGVyXSk7JGjigI1fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlPSh2YWwpPT57XG5wYXNzU3R5bGVPZih2YWwpOy8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHJldHVybnMge2FycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyYXkpPT5wYXNzU3R5bGVPZihhcnJheSk9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/woqT7oLAAC6CwAAHgAAAEBlbmRvL25hdC12NC4xLjIzL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHbyrHWwkAAFsJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJeI4FvKAgAAygIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACEEb/TqRIAAKkSAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdAwMj1QHAABUBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAJa06Fh2oAAAdqAAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAAe3aYBoLAAAaCwAAIwAAAAAAAAAAAAAApIFPqAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanNQSwECHgMKAAAAAAAAAAAA4m9OmTgvAAA4LwAAIgAAAAAAAAAAAAAApIGqswAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADZEh3gDjcAAA43AAAmAAAAAAAAAAAAAACkgSLjAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABsKKc08gUAAPIFAAAnAAAAAAAAAAAAAACkgXQaAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAAyb0sONMBAADTAQAAIQAAAAAAAAAAAAAApIGrIAEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAANpYetwzGwAAMxsAACUAAAAAAAAAAAAAAKSBvSIBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAKS7skYwFAACMBQAAOgAAAAAAAAAAAAAApIEzPgEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADliLpcmQUAAJkFAAA6AAAAAAAAAAAAAACkgRdEAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAF+1eMQcBgAAHAYAADYAAAAAAAAAAAAAAKSBCEoBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACRgLmufwcAAH8HAAA2AAAAAAAAAAAAAACkgXhQAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAABFQ/K4EEAACBBAAAIwAAAAAAAAAAAAAApIFLWAEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAApDunh988AADfPAAAKQAAAAAAAAAAAAAApIENXQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAuURUuO4OAADuDgAAIQAAAAAAAAAAAAAApIEzmgEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAN7bNaX7BQAA+wUAAC0AAAAAAAAAAAAAAKSBYKkBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAA2mTG2hiYAAIYmAAAmAAAAAAAAAAAAAACkgaavAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAArg3H76UIAAOlCAAApAAAAAAAAAAAAAACkgXDWAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAAClj/TuhQQAAIUEAAAwAAAAAAAAAAAAAACkgaAZAgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL21ha2VUcmFjZXIuanNQSwECHgMKAAAAAAAAAAAAu2FjbYQNAACEDQAAQwAAAAAAAAAAAAAApIFzHgIAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92YXVsdEZhY3RvcnkvbGlxdWlkYXRlTWluaW11bS5qc1BLAQIeAwoAAAAAAAAAAAA02dIraAQAAGgEAAAlAAAAAAAAAAAAAACkgVgsAgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAAK/0Jsh9AQAAfQEAACQAAAAAAAAAAAAAAKSBAzECAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAACtprWJjQAACY0AAAkAAAAAAAAAAAAAACkgcIyAgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAUvPdOIgLAACICwAAIgAAAAAAAAAAAAAApIEqZwIAQGFnb3JpYy9uYXQtdjQuMS4wL2Rpc3QvbmF0LmVzbS5qc1BLAQIeAwoAAAAAAAAAAAB3Sz4jox0AAKMdAAAzAAAAAAAAAAAAAACkgfJyAgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAHa5YMuoJAADqCQAAJAAAAAAAAAAAAAAApIHmkAIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADmvR3hAKgAAQCoAACcAAAAAAAAAAAAAAKSBEpsCAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAUktAkixcAAIsXAAAqAAAAAAAAAAAAAACkgZfFAgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAA8lst6UYeAABGHgAAJwAAAAAAAAAAAAAApIFq3QIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAANG8TLk5DAAAOQwAACkAAAAAAAAAAAAAAKSB9fsCAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAAG3m3zOlIQAApSEAACwAAAAAAAAAAAAAAKSBdQgDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAANbWKjOVAQAAlQEAACAAAAAAAAAAAAAAAKSBZCoDAEBhZ29yaWMvc3RvcmUtdjAuOC4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAAQZq6gYIgAAGCIAACEAAAAAAAAAAAAAAKSBNywDAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAhBPmUgkMAAIJDAAApAAAAAAAAAAAAAACkgY5OAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAA0aHctyhoAAMoaAAAsAAAAAAAAAAAAAACkgVeSAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAABMi+KkDhMAAA4TAAAoAAAAAAAAAAAAAACkgWutAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAAI6EjZOHDwAAhw8AACgAAAAAAAAAAAAAAKSBv8ADAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAAS3V5OBoiAAAaIgAANAAAAAAAAAAAAAAApIGM0AMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACUyt2rrSUAAK0lAAA0AAAAAAAAAAAAAACkgfjyAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAAAAAAAAAAAAAKSB9xgEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAFrLlgatBgAArQYAADAAAAAAAAAAAAAAAKSBSiQEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAACg/IAq0kAAANJAAAAzAAAAAAAAAAAAAACkgUUrBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAkaTJgTouAAA6LgAANAAAAAAAAAAAAAAApIFobAQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1BLAQIeAwoAAAAAAAAAAACidUd8tQcAALUHAAAzAAAAAAAAAAAAAACkgfSaBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA19JpZfPIAADzyAAANAAAAAAAAAAAAAAApIH6ogQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABzKVNO8DwAAPA8AAAuAAAAAAAAAAAAAACkgT9sBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAADgQTiz1FQAA9RUAADEAAAAAAAAAAAAAAKSBe6kFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAANn8xvmsPAABrDwAAMQAAAAAAAAAAAAAApIG/vwUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAol+VuphEAAKYRAAA1AAAAAAAAAAAAAACkgXnPBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAJSIAWZw0AAGcNAAA1AAAAAAAAAAAAAACkgXLhBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAqUK3IPBMAADwTAAAuAAAAAAAAAAAAAACkgSzvBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAD8gSqBEdQAARHUAACEAAAAAAAAAAAAAAKSBtAIGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAW55lGriIAAK4iAAAuAAAAAAAAAAAAAACkgTd4BgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZmFyLWNsYXNzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAI/LOT89BgAAPQYAACQAAAAAAAAAAAAAAKSBMZsGAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAjyCi0NAkAADQJAAApAAAAAAAAAAAAAACkgbChBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMva2luZC11dGlscy5qc1BLAQIeAwoAAAAAAAAAAACtx2ZtyhwAAMocAAAwAAAAAAAAAAAAAACkgSurBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAA7aBS7qcQAACnEAAANAAAAAAAAAAAAAAApIFDyAYAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1BLAQIeAwoAAAAAAAAAAADSnu6A4BsAAOAbAAA4AAAAAAAAAAAAAACkgTzZBgBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc1BLAQIeAwoAAAAAAAAAAAA0Q7d+6xEAAOsRAAAwAAAAAAAAAAAAAACkgXL1BgBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAg6F01VUlAABVJQAAOQAAAAAAAAAAAAAApIGrBwcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzUEsBAh4DCgAAAAAAAAAAAORdLQqsCAAArAgAADUAAAAAAAAAAAAAAKSBVy0HAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzUEsBAh4DCgAAAAAAAAAAAIVtGLUUNgAAFDYAADAAAAAAAAAAAAAAAKSBVjYHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qc1BLAQIeAwoAAAAAAAAAAADWt007wQUAAMEFAAAzAAAAAAAAAAAAAACkgbhsBwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanNQSwECHgMKAAAAAAAAAAAA2Vjr34UEAACFBAAANwAAAAAAAAAAAAAApIHKcgcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qc1BLAQIeAwoAAAAAAAAAAABAimz3XwUAAF8FAAA1AAAAAAAAAAAAAACkgaR3BwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc1BLAQIeAwoAAAAAAAAAAADK7i8JpgsAAKYLAAAwAAAAAAAAAAAAAACkgVZ9BwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA3CaHJ+46AADuOgAANQAAAAAAAAAAAAAApIFKiQcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAAAAAAAAAAAApIGLxAcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAAAAAAAAAAAAAKSBuNYHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAAAAAAAAAAACkgQrZBwBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAITWh/C/EAAAvxAAAB0AAAAAAAAAAAAAAKSBLukHAEBlbmRvL21hcnNoYWwtdjAuOC4xL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKo0/YJCDAAAQgwAACsAAAAAAAAAAAAAAKSBKPoHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAMMCGcApAAAAKQAAAKwAAAAAAAAAAAAAApIGzBggAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAADAGgwheT0AAHk9AAAtAAAAAAAAAAAAAACkgQZHCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAApsoXZOgGAADoBgAALQAAAAAAAAAAAAAApIHKhAgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAJOHBWHTBwAA0wcAAC4AAAAAAAAAAAAAAKSB/YsIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAADJmk2mARAABgEQAAKQAAAAAAAAAAAAAApIEclAgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAA0TG62UYIAABGCAAAMAAAAAAAAAAAAAAApIHDpQgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAAwC6if0GQAA9BkAADUAAAAAAAAAAAAAAKSBV64IAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAATybD72HwAA9h8AAC0AAAAAAAAAAAAAAKSBnsgIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAUxqrBig8AAIoPAAAwAAAAAAAAAAAAAACkgd/oCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAZRP9aLkSAAC5EgAAKgAAAAAAAAAAAAAApIG3+AgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAAAq0udbgBwAA4AcAACoAAAAAAAAAAAAAAKSBuAsJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAARmjtQ9BgAAPQYAAAkAAAAAAAAAAAAAACkgeATCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAW/MDZykEAAApBAAAJgAAAAAAAAAAAAAApIEWLQkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAA0CUOi7woAAC8KAAAKgAAAAAAAAAAAAAApIGDMQkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAADLXk0XDBgAAwwYAAC0AAAAAAAAAAAAAAKSBh1oJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAABp3935VTIAAFUyAAAjAAAAAAAAAAAAAACkgZVhCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABBZ7N5AhwAAAIcAAAnAAAAAAAAAAAAAACkgSuUCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAgjnZkwMNAAADDQAAJgAAAAAAAAAAAAAApIFysAkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAu1cO9x8BAAAfAQAAIQAAAAAAAAAAAAAApIG5vQkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAP8KKk+6CwAAugsAAB4AAAAAAAAAAAAAAKSBF78JAEBlbmRvL25hdC12NC4xLjIzL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABHbyrHWwkAAFsJAAAiAAAAAAAAAAAAAACkgQ3LCQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJeI4FvKAgAAygIAACsAAAAAAAAAAAAAAKSBqNQJAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAhBG/06kSAACpEgAAKgAAAAAAAAAAAAAApIG71wkAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAHQMDI9UBwAAVAcAADUAAAAAAAAAAAAAAKSBrOoJAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACYAAAAAAAAAAAAAAKSBU/IJAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3R5cGVzLmpzUEsFBgAAAABgAGAAnSEAALbzCQAAAA==","endoZipBase64Sha512":"72db789f3513d8f7cf7683a0fbd3d4cb908b2da94265319a47103976f1185001225450a990c2ebc787a0b1dad5f88f05ee065aa4cd3fb2ef4d0ae8f01023827c"};
1
+ export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABvLaTiHagAAB2oAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdWx0RmFjdG9yeS9saXF1aWRhdGVNaW5pbXVtLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyMjI2ZGYxOWEwYzViYWEzNGU1NzQ5ZGEwMDllYjI3ZTZiYzEyMTFiNWZhMzY3YjBhYWM4N2Y3M2QzMWJhODdjYWMwMDM5NjM0ZjA2MjNjMjliMGIzZDcyYWU2MWQ5NjBjMzllM2ZjMzQ3ZWY3ZmFhODAzZDVmYTc4OGU0N2IxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MmQ4N2ZiMDNhYjc4MTY0YzM0MWZhYTJmNmZjYjZlZTg3M2ZlY2RmMmM3MDA0MjQ4YjM5MzU3MDYxMDJjOWM2ODZjMTJmNTQyYjQyMDdhNzk1OThkMmUyMDVlZjVkYzJiN2YwZjRkZDVmYzBjYmFhMDBmZTdhNDNmNWQwYWU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhOGQwMjk4NjFjNWUzYWZiYjc2MTJmZjU5NmVhYmIzYmYxZDQxMmJmNTFmYzZhNTQwNzljODRlMDc3NDY5MjlhZWRjZjk1NjliODU0YTY0NWZiOGViMTliNjM3MjllMjU0NjVmYzQwNmZhYzM2MDgwZjhjZWFmMzNlNWY1YWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1YmU5MDUzZDM1MWJmZWEzYWUzNDJmZDUyMmUzNzVhNzY1OGQ1OGVkMWU4NjFjNDJhNThjMzRmOWMwYmE0MGE3MzQxNmVjMDZlZTQxNGViYWY4M2EzZGRhMjZjZDg1YTFiYjYxODMyNTNmZjgwYjU1YjRkODEzZmJjNTA5NDcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViZWE3NGFlZjAwODNlNWUyM2RmMTJkOTIzZDgxZmRmYmYxYmRmOGRkNjFmOGUzMmFjODU4YWJjZTM4MWYyMzNkMWM1NGQ5ZTZiMTcxNGEyOWJjYmE5NjE5ZDQ4YmI5YTYwNzE4ZWNmNjBlMDg1MWFhMjEzMjUzNmEwMjNiY2FjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2JjZjIwY2VhZGIzNTg4MzMxNWMzN2JjNjdhN2FiMDQwZDk3NmY0ZjY3YTExMDYxNTE5YzYzMjFiYzhmN2EzZGQ0YTMxOTNlNjA5MDJmNjIwMmYxNzFlZDk2YTc2NTk5NGJmNDZhMjdhZDQxNWM0NmQ3YjI1ZDkzNGI1MDIzZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YTE1MmQ3MzA0OGYxNDJhMWU5OGE5YjQwM2EyOTgyYTQ2MmRjYWJkMjY4NmY3MWVmZTQ4ZjkwYzdhMTc3NTYwOTdjMTk1MTkxMjMyZTM3NzA5Y2E2N2IyN2RlZDk4ZDhiNzI1OWEyZWFmYzg0NTkwYzgzZmI4Y2Q4NjE1NzJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZmMGE4MGFjMzNhN2NhM2RjNDVmNTZhNjM4ODMyYjQzNTM3OGZiZDEyZDY1NjY2NGNkZjE3OTQzNTZiNzAxY2I0MzEwNjdiYmI1NDNkZjNlNDhiMjMwMzNiMWU0MTQyNjdhYTJmYmNlNTBhMGMyMDJiOWY2NmMzZmRiM2VkODliIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjYzQ1OTU5NDUxMTNiMGI1YTFiYjA3NDA3YmVhMmNlNjVhMDZlYjZiYWQ0M2U3OTYyODFiMmVjZWI5M2U1MjJjOTUxNjEzNTUxOGU0NjRhM2YwMDA2YWY3MDE1ZDNkODZjY2M5NGIyZWFmN2QxYTUyNzJiNmRkY2VhZTEyODY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MTk2ZDc3ZWJkNDAzNTI2YzRkYTg1MzZlZWVjMzZhMTEwYTMwNDM4YTAxOTgyMTkxZDdlZjE2NDc2N2FlZDc5YzZjOGM1ZGJkNjNmN2Q3Mzg0OTk1ZjlmZmMwNmFlODNiYmQxODc3YWM0YjVjMWY3MDNjMjE1NzEzMjEwYmQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNmQxZDYzNGE1NmY5N2FkM2QxMDNhNDg3ZTdkOTg5MWU2YTkyYmMwNmViZGZkZTU1MTIxYjY3MDdlMGM5MDlkZDVhZTY4YjUzYmFlMzQwOTEyZTZkYzdjOGI1YzYwMTBkNjcxOTBmODgzMzQyOTA2YThhMDllNjU5ZTM0MzI0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTEwNjIxNGNmYmM3YTAyZTllYjM2ODk0YzZlYTg0NDEzYmIwYmNiZDYyMGM1MjdhMWQ3YWQ2MjFlZjQ3YWI3NzUzN2VjNzM0ZDI5MDc0M2MyOGZlZGRjMmFkNzk1MjBhMjA2Yjg4NzY2MzE3YTY0ZjhlMTViYzBiNGFjMjgxODQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjkyNmE1YWMwNzY1MjJiODIxZDhjZDY5MTg4MmFiNDdlNTkyYTJjYzRmZjZhZGU1N2I1MGVjNmY3ZTNhOTgwZmU1YWJiNWUxNDU1NDJjODQyNTMxZWM5YTYzMjM2NDk3YWYzY2ZlMDQxMzliOTAyMDNjZWZjZWE1MjUwOGNmOGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzhlOWNmNmQxOTAxM2RjNDRhOTczODdmOTY0NzNiMGVlZjRjMzczM2ZkODU5MmMzZTA3NmNiNWZkZjZjMGFlZDgxMWVkM2ZmYzhjNzMxNDBmNzEyM2Q1Y2NiZTI0NWRjYTJjMTc1NTdhM2FiOWZkYTU1MDA0YmIwZWE0YTI4YjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwZmUwMzEyZjJlMGYwNTg2YWIwMTk4OGQwZThkNWQ3YzEzMWEzZDA3YWNiZWMxODBjY2JiODc5ZDVlZjRiMDcxZDZkODEwMmVkYTE1ZTNiNmY2ZGY1Mzk1NTFmZmNjMjIwMDcwMjkzNDgyZGY1MTU4MzE5MzZiZmQyYzFjZjhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjIwNmZjNmRkY2UxMDM2YzVlYTY1MTZhZDIxZTkyZTNmZmU3MWFiNTVmODdjY2IyNjRkZGVjM2U0ZDA1MjVhMWViMjkzYzM3YWQxN2M5MmZjNzdlMTAyOTQ4NzBiOWQ1OTIyNGY4MGQzYzM2ZTg5Y2IzMGJlNjFmOWQwYzg3YyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kaXN0L25hdC5lc20uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVHJhY2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVHJhY2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg4MmQxOGRiODgxMzNkYzc0ZDNkMTMxMzk1ZWU2N2JiYzkzMjk0YWQ4N2M5YjU5MTBiMWVkZGE0NGMxMTg2MWVlOTkyMjQ4NWYzNTU1ZGI0M2VmZmMxYjcwZjE3MDg5ZDk5MGJkMjNiMmJjZmE0NzM5YzgwZThiOWI3Nzg0ZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF1bHRGYWN0b3J5L2xpcXVpZGF0ZU1pbmltdW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdWx0RmFjdG9yeS9saXF1aWRhdGVNaW5pbXVtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWVjYjhlYWVjMDkwMWYxNzdhY2JhYzVhZjYyN2RkNDI0NWU1ODZiNjM5OTQ4NjI0YzAyZGY5MjM2M2EyYjdjOTkzMWMxYzgyODk4YTE0YWQ2ZWNmM2EwMTk2MmUyZTFkZTU1ZDBjNWUxZDUwYmE1ZWRmMDQyYjUwNmQwMWQzNjgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWUyNzBmMzUwYzA3OWNlODZmYjY4MzQ5ODJhNmE1YjRlMTkyMzEyMTk4MWYwMWVmNWYyNTQzMzA2ZTRlYmNmZjIxMTQzZTMyOTViOWM4ODEwMGE0Njk4YWI0YzA3MTgxMWMwNjZkZDAxMDEyMTE5YzAyMTQyZjNlOTgxOGI0MzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTU4NDQ4MWY5OGM2MTM4ZDBkYzJlOWRmNDJlZjcxOTE4Y2U0ODgzMzc0MTA1YzM5NWVkNjYzYzMwZDljMzk4NzUzZDA5YmJiMjE5YmUwOTlmYTFhYWEwMDk1MGU5MDE4OTM3ZDBjNDZiZDhiZDg5MjQxNTFkYWE0NDE4MTVjZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDQ5YjI5Y2IwMjE4ZGY2OTA5ZGQ0MDFkZmE4Y2Y0ZTVhYWM0MTdmMTVmOTkzMTk0NjJiNzgzMGM3YmE5NWU1ODQxMzA5ZDY3MDMwZWM1YTI5MWNlZGE5ZWFjNDI3ZjBlNDgxZjY0ZTUxZGE4ZWZkZGI1MDU3Mjg5M2M0MTE5NTkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbmF0LXY0LjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9uYXQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZGlzdC9uYXQuZXNtLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImRpc3QvbmF0LmVzbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYyY2U0ZmI2MTdlNTQ4YTI0YmU0MDc0MjQxYTQzZmQ5ZDIzZjU3OTkxNDAxMzI3NGUwNjYwNzk3NGRiOGFjMDEwMmI5Mzc4MDgyMWJiZjZkNDk0Yzk1YWRjNTRjYTIxNDdiMTI1ODVhZDg5NjJiMzA0OWY0MjhjMWQ5OWEyMDJlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWU4YWFmZGIyNDNjNzkxZDBkZTE5ZDQwOGI4ZWY0ZmM5ODBkMGEyMDliMThhN2NmM2JiNDE4N2Y4Y2Y4ODdmZjNlN2FmNzFiMjM4YWFkYjYxNTQ3MGYxNmZiOTY1ZTkyNTMwMjIzNWM1ZDE5NzBhYTA1Njk3N2Y3NGI0NzI1MDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODYzN2RlZTQyMmZlYTc3ZjdkM2VlNTdmNWU0YTE1OGUxMWE5ODU3YTI5MDEzNGFkM2I2ZGFjZWExNDdiNzQxZGZjMTQ5MDhlYWI0YWIyODY2MDg0MTJlZmY3MDA1ZTJhZmFjZjY4YmM2Y2ViOTA2N2I2ODk1MjI1NGMxZDI5YmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQ4ODBmYmZiYjExOTcwYjlhMzUxNzQ0YmQ1ZjRjNzY3MTJkM2ZmZTk4YjQzOTU1MTdhNzI5ZjFiOTQwYTg5ZWUyYjM1MmU3MmRkYjA5ZjQ1OTZmMDU1YzdhYWJmOTk2OTg4N2Q0OWMxZmNjZmRmNzg5OGY1ZTRhYjhkNjdkZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODRjNWM4Zjg2ZTA0MjI3MDVmMThlY2QwMjU2MWViNjFiY2YwY2I0MzkwY2E4Y2E0OGRiNzcwMjRkNmRlOGY1OTY5OGU1Yzk3ZjQ1MmQ3M2NmYjNkYTFmMWU2M2FlNjk0YWU3ZmI3ZDM5YTdhMTE4MmNiNzQ4MDczOGJmMzdjMzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmY4ZjlhMDI2ODczMzRmOTExOTJmNzE3Mjg4MjYxYTIwMjZkYzA4ZmVjMGMzMWYwN2JjM2NjOTliNDJlN2E4MjVmZjVjNzFiNmJhMzI0NjRkMjVhMDEyMmZjOTRiZDBlODlkYzFhMTY4NDQwMDlmNGYwZDk3NmU3NTE1OWJmMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3Vic2NyaWJlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNlZWEyOTk0YWFhMzU4ZTFlYmYyM2NlNjA2NzBhMjg0MGY5MzBhNDU1YzYyMjgxYjZmNjljZDUyNWUwMWNhNzg3N2VmYjE5NDJmNmMxNjBmMzg5NTA5MTIyMGMzYzVjYTkzOGM4NTU5ZDMxM2U1Y2E4YWY0Mjk2YjRmMjQyNmUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNGI2ZGIzNGM2OTlhNTNhYjQ2MDRlZmM1MmU2MjdmYzE4YmRjZjFhZDc4MzQ1ZTI5ZDVkNmQ5NmM0MDI5OTIwYTQxNjA4NGNjZDM1NWE5ZWVhNzIxNGE3YTAzZjU3MmRhY2M5MWY2NzllZTkwZGU1YjFlNzlkZjliMGUwMmU3YiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC44LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3NyYy9oZWxwZXJzL2Vycm9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaGVscGVycy9lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI5ZmUzNTMwNWY4MDdkYTIzNWYwNjg4ZDNiNjVlMzUxMDM4ZGZiNTc0MGNmNzI4MWMyMGM0NTM4MjVmODNhMDY2Nzc2OTZkM2JlMmMwMTg0YmYyZDI1MDgxYTA4YjkyOTBkZWVjNjlhMzlmODg2MjkwMDE3Y2M4MmJiMDRjNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmUzZDMzNDIwNDc4OTBjOWFmZjk2MGNkOTY0MWFkNWEyMDBmZGE1NDZkNzlhYzM3ZTgxYjhlNmI0NGVlM2VjNGJjMWFlOTE1OTA4ODllNTNmYjliNGIxZTVjM2ExNWIxMGE4MzFlNGQ4Njc2ZmY0YmNkZTg1MDlkYTBiY2Q1NzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjOGNmZTU4Y2U5N2JhNjVhZDBmOGJkN2IwN2MxNzFkNDU3MDIzZGJkNjA1MzIxMjU1ZWZmZGI0N2JjNWQwMDFlMTdkMTYxMWJjNzM5ZmVmYWE2NjE0YjUwMDU0YmQ5ODE5Yjc3ZDI3NzgyMDY0MWIyZTcxNjZlN2Q1MWViODY3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNjBkOTlkYzU1NDIzZGQ3ZmM0Yzk1ZTNhN2I2MWMyYjFkZjIzODAxN2QwOTQ0NDc4M2NmZTUwMjk3MWY1NzE4N2RiYjkwMTAxM2U1NTA5MWUxYTMwZWY3N2YyMGJiMWZlZjA0Y2JkOTJmZWIyZDNmNjJkMjM4YmEyNTk1NTRjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyYTRmNmIxZDRhMjhkZmRiZjA5OWFhYTZlMjJjMGIyNzNlMTFjMDA0MzI3YjNmMTEyZDgyOTc3MDc2YzdlZDBjZjQ3ZGYwMTRlZTUwMjM1M2E2NWU2ODI1NGYzOGJiMWVhNTI0ZGRmNjNmZDQ1NTBjMGNmNDk3YzI2ZGQyYzE5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGE4MWI4ZDE2N2E5ZDhlYWI5ZDFjOTQ3OTRjZTA1MTE5MjdlODdiOWQ2MmNkMTBlMGE5OTdjZWY4M2IzNzI4MDM4MTk0NmY0MzBjNzgyZTE4NjI0ZGI3ZmRiMTRmZWYwNTAwNzYwN2U2ZDkxMzczM2MwZmU2NzI1MGJjZDg3NzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YmJmOTc0MmNlZjQ1NzVmNTFmZTI0ODBhNTllNDVjNjI5MzE2ODA5YTg3N2RlMzBkYzViMzViMTBmMTA1NWI2MWIxNDVjMzYyZTZiODQxMmNlZWRhYjE1Mjg5MjgzZjA3YWE2ZmNkODk2NWUyYmIwZGZmOWE0ZjBjMTk2MWRkNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1M2I4ODU4NzQyYzQyZTY0ODNjNGZhZTdlOTQ3ZjdhZmRiMWVkZjZiNDAwZTgyMTVmY2ExZDQ3MWY0MWZkMzJlOWI0OWNhN2IxMTRmZTk5ZGQxZDU2YjY5NGIyOGZkMGQ5ODkxNjNjMjI3ZmQ3OWVmMzBhY2UzMDhiYTUzNzAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOGRiYWJhMWE4YTYzYWMwZjAwMTRjMWI0OGY1NmNkMzQyMTZhZjMzNGMzZmU4MjgzZjYzMzhjOWE2N2ZlZjQ4NDI4MDlkOTAxMzI2YTllYWYwNWFkNjg0ZjRhNGIwMzdiNTNlM2E5MGY4YmIwYThiZGQ1ODcyMmIwZjAxMDNiNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NGZhMTA1NjkyNzdjZjY3MzM5MDdmZGIyNDVlOWJlZjIyYThmZTdlNzljYTA1YmVkZjdkNThiOWVjNTUyNmMzOGMxYTkwZTNkODJhZGJlYmRjYzk1MTFkZjk4MzRjMTMwZGVmY2QzZGQ5ZDIwZjE0MmEwNjZiMGYyM2U4ZWNiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzY2ZkYmUyODBmZjRkNWFlMzMzOWIyZDk5ODY2OGI2Nzc0MTYyNTgxNDY3ZGM5YTVjNGNiYWMwYjUyNDI3ZTQ5YmMzMzRlOWNjYTQzOTJkODMzMWYxZmQ0MjAwZDgzNGMzMWMwNTJlNWU3ZGU4YTNmOWYwNjBjMmZiYjc0MDhjNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1ODZmZjUwZTExMjkzOTNjMzNmMWUzYWE5YTA4NTU0N2E5YjhhYmMxYWE0YWJhM2IxNzlkZTY1MzJmZDhhMTQwMDBmYzQwMmJlY2Y1YTNjNjhiYTc3NTM0YTdlNzJlNDYxOWI1YTkzNTk3NTgwN2UzNTM4ZmFkOWVkMjc0YTZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzNWQyNjg1YTFjZjYwOWJlZTU5MDNiMjIxNmFlZTM3YzgwN2ZlNGUxYWNjNTI5ZmZlZWM1ZjI1Mjk2Mjg0ZjJkZWY1NjYxNmRlNzM2YmIyZDU0YjFmNjUzMTZmYjdjNTlkMmJjOTg2NmFjMmI1NjMzYmUwMmFhMzdlMjkzM2QyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzBjZWFjMGNhOTVmM2NlZTk0MTJiNjM1ZTBlOGVmMWU3YmU3NjJmN2RlYTIxM2M0MDRmNDVlZWY0ZDUwMDI1YzE5YTgxZjhiNTFmMTI4ZmRmNDQ0NjZhOWRlNWJhZWJlNDMxOTAzYjFkYjc2MjlmNmExZjc4N2EzNzQzOGY1Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0M2RmZGQwMmI0ZGQyYmVmMTVlOTdiZTc2Y2RiZTJlYzg3YTM3MzZkZGQ0M2Y3NTcyOTVmM2U3ZDBkYTViYmJkYWQyMDIwYTc5ZjRjOTAwMTIxYmFkOWNiNTlmY2VkN2EzNmMyNTNlZTcxZTkwYjE4MzMwYzMwYjYxNjMxYWViZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYjczN2ZkY2M5ZGQzMGI1NjIyMjY4ZGQyY2QwNTQ1NDkxMWFiZWQwNThhOGFmNGRjNTFjNGZhNTQzYTI3YzI1Yzg1MDEyMGM2ZWZlNjVlNDFhYzc1MWM1ODU0ZWQ4ZjE3OGQ5M2IyNjRkYmM5NTdlMmI2ZTEwOTNmMWExZWE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWU4NjUxZTFlY2NkMmJiNzE5MTQ0MzUxZTQ0ODBlYzVmZjc1YTdmODIwNDE2YTFkNDdkZjM1YzMxYjNlNWE1MGZmYjIwNGE0MTk5Y2VjYjU2ZDkxMGM3ZWU5OTMyNzU1NjYwMTUyZjE1OGE0YTBmYmNiNzc5NmJjYmQ5ZjM3ODgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzNjYzNWI4MGIxMmY5MmQ3MDMyZDEzZTk2MzJiYTkxMDEzYzMwOWQ3ZDc3NjYyOTY4NWY2OTkyYzc5NWI5YmY2NjVmYTY2ZjU0YTA2YTUxMzIxN2UyMGNlMzhlZjQzNTNkZTk5ZjI3YzNhYjdhMTM3MzM3MmU0NWNkOGJlZGRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNmEzZDViZThhZTcxOTVjZTM5NzZjMDgzNTlmZGE2ZDE3ZjExMjM3ZjllOTQxZGZlNTZlY2ZiZWViOWMxNWJiNWUwYzkzM2FhNjk2ZDVkMjJkNDY5MzcwMmZhZmY5NTkxNGI0ZmUyY2IzZTZkMTY4ZTM5ODE4ZDVmYTY2Y2MzMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5NmExMTE1ZDMyMjQ4NTQyOWY4OGM2ZDUwMjEzYWY0ODA0YTE4NmU4MjM0MWJjY2QwN2NhYTNhNWUzMGRhZjE1MDYwMjM4NzVmMzFiZmJiZTZhZTg5MmE1YzJjYTdiYTA5NjY0NGNkM2MzMzkyMmQ3OWNlNDExMTJiNGVkODBjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1Y2NiMTAxZjBjODRjZmY0MDI0NjY2YWY0ZjcyNzQ2YmQ5Mjc4MWE0N2Y4MTllNzVhMTM0ZGZhN2M2YjZhMTJmMDEyNjYwNGQ4YWY3OWQ2NWNmYTgxZmU0MzZhNjQ4NWQ1MDc2NDg5ZDAxYWU1MmFiZWZiZTg0MTlhZjNlNjgzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zhci1jbGFzcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZmFyLWNsYXNzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTBlYmU5Mjk4MjdjMmMxNzJmMzc3NmQ1MzBmMDdhYmY3YWJlMzFiYmMwNmY3ZDVkYTgxMWJlNDZkOWM5NzI2MWUzMjM1OTZlMDFkYzkzY2MzNjljNzI1ZjJjOGYxZjgwMmRiYzc4NTg0NjYxYjY2YzAyMWY4YzQ0MTRmODI3MDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjA0Y2M0MTY5NWY3ZDJkMmRlMWFlNjkzYTUzYzg5OTRlNTFlYTFhMWEyM2U4ZjhiMTIwMWM3NDUwOWM1ODI1YjQ0MzM0ZjI1Y2E5N2IwNDg5YjczODNlNDI2ZmQzYjdhZTQ4NWYyY2ExYjRjMTQzM2IxNWI3YWQ0MzZlNjY3ZTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2luZC11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2luZC11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAwNTlhYTVhNDc1ODhkMDBlNWQ4NTAzODQyN2Q5Mzg2OGMzODY4YTJmMmM2MDUwY2RhOGFkODgzZDM0NTY0OTg3NzZmNDRlNDBjYmI2ZWJkMjYxOTM2MTJmZDZhZDc4NzliODEyMDAxZTNlNTMyMzVlYWM2ZjU2MmI1NjVkZTZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhNjAyYTlhMmQ5MjdiZjE4NWI3YzkzZjQ2NWIxN2MzOTU0NWY1OTI4MGU1NThiMGQ0ZWMzMWVjNGNiNmVhNDEwMDUxNzlhOWY1ODY4OTk3NWE0MzlmOTE5ZTQzNTYwMmJhNTA1Mjg4NWMzNmVhNWUyOThlNzAzNTg0ZDBhZGU2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNS4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjEzLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2M2U3MTJhODlkNTViOGZjNTc4M2JiNmY1YTRlMzI5NzdmYzNhMjBkMmJhODIxMjhlZDdlM2FkYTllNjNhY2ZlMDYyOTUyZTFlODk0N2VlZWU2NDUzOGRjMTAxZTRiZTgyMjc5OGFlNTZhMjZhYzllZDM5NDBmMjYyODhhYzBjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5YmE0MzlhY2Y3OTgzNGVmZmI3ZGYwZGI0ODNiYzA4YTNiYmVmMzZkYTI4OGMxZWY1MmRhMzE1OWFjZDAyYmVmYTE4OWYxZjA5NjA5NzYxYjVkM2Q3OWY3OGE5YmE3NzJiMGQ5NWUxYTE4MmJjMTFiNGUwMzUwMGIwMjI5MmIyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2MxNmQzODAyOWM0MDgwMWRiMDBiNDc4ZDkyOGI4MjMwNjk0M2M5ZDExOWFlZDE4NzcwM2U3OTIwZTFlMWFmMDU5MzAxNjNmMDRkY2E0MzI4MTM1NTRlOTZiOGFlYzc3NjViNTBlZTc2NTJjNmY1ZTBkM2MxZWY4NDlkMWM4MDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMjU2NzJhMGVhMzc5MzE1YWE5YmMyNDk1NmYwNDYwYWQ4MDMxZGY0OTUxZGZlNzQwZGQ0YzM0MjBhZjAwNzgwY2FlODlkNGM0YjZkN2EyZmM3ZTRjMzU1MDE0Y2FjYTIyMjIzOTIzYTc0MzEyNGNmOTcwZGI5MTE4MWJlOTc2ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzY2M4NjIzYTI4NTkzYWZiMjFjZjViMWNmNDBjNTYxYzIxZjgxMTViMDhlZjgzZGYwYmE2YTIzZTU2MmU0ZTA3OWRmNWMxYTAxOWE5M2EzM2M2NzIwOGYxOGU4Y2RiNWIzZjVhOTUwOTU0Yzk0ZWUxYTE2MDNjOGYyZjAxOWU0MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkwODE5OGQ5YzZkOTk0OTRkOGY0YWU2OWQ5MmE0ZjM2MzQ5YTBhZmZiNGM1NjY5ZTg0ZmM1NDhjMzc0OGJjYWQyNzg0ODBhZDA4MDdmMzM3YzNiOWE1NGM5NDYzMWFmZTAyZDAwNGUxNzUyM2VkZTBiMTRmNGJhZGFmMTkwMmRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zYWZlTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTAxYjgwMDAxZjVmNTU2MjJmN2M0MmQxMThmYTE3MDk0MmIxMTQxYzNjZTkwYzZkMjA3NzQ1ODk3NzY3OWEzZDUyZWI0MjNjMmFiODZkNmI2MzQ2YzM0OTk2MzU3ZGVjMDdmZjU0ZWI3NDJmODExYzk5MjVkMWEyN2VjODEwODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzMTFiOThkZWY0M2U2ZGRmMTRhY2ZiYWJjMGMxZjY4YjhmNmI4NTgxZmUyMTE5ZjlmOTE3MmE5MDA4OGVhYzk2YmJjMGU5ZGZiYjE1N2I3NDQ3MDEwYTgzZjRlOGNmZjYzOWE4MjdiOTRlMjBjNWQxYTlhOGZiZDJkNjQxZTBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiNDk2YzYzMTcxOGQ4NmQ3ODRhYjBkMjVmN2JmZmEwNTc3ZjU2YTc3N2IzNDcxNGRiMTgyMzA0YTk5ODQ3YzU4MDBkN2FhZDBjNWI5YmU0NzA3MGI2NWI2ZjkyZjNiYmNmNGMyYTA5NzkwYmYzYjhhOTY0NWUwMzMzNDJkNGEzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDEyZjk0YTAwMmYxMGM4YWVjYzVlYmZhYmM1YjIxMWFmYTdkNjVmNTBjMmFjYWQ2ODQyMmRhYzExZDllZDI4ODBjM2RlY2EzMDQyZDQyYzM1Y2JmODM2ZGFjNDY0NzdlNGU5N2RlOTg1ZjA2NGYyY2E4MjIwYmFlOWQ3YzVmMTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGI2NmE5NWFhNTNkMjkyNWJlOTNiZTA4MDhhN2E0NGJhNTc1YzY5ODc5NGM3ZGI4YjRhY2M0MDllMzEzOWJjODg5ZjYyNGUzMzQ1NWExNGZlYTM5ZjA5NDg3NWQ3MjZhZTM4ODc0YzMxOWZlNDA3MDQ2OTJjM2NjNTM1ZTZmYzUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY1NWZjODk5MzQzNjFiZGYyNTJhMTA0Y2Q2ZmI0ZmE3YmE5NGVkMjdlOTEyZGFiZTRiZmUyN2FmYzQwNjIxNTQ1NzExNjk3N2Q2ODY5ODdkMDYyMWI1NzhlZDExZjgwMTFiYTYyM2U4N2UwMDEwYmUxMWZiYWFiZDE1YWU0ZDM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YzY4NTNiYTFlNTQ2ZWZlYzg1YjJmNjhjOTM1OGQxNzQ3OWFjYWM5M2ZkYTllZTA0NGUyZmU4MDA2MDdlMWE2YjYzMzMwNmM1OTdmOTI5ZmRhYzhmNTRhY2RmZTY0YWJkYjUxYjUzMDQ0ZDJkMDhiYWQ5MGEyZGQ2ZWExNzgwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MjJhYjA3NGY1MTYwM2FiZDA2ZTNiMTk2ZmVhYjFjYzE4MjZiMWEyNjM3OGQwMjViYmIzZGQyNWFlNjY0NDMwOTE1NTM4ZjBhNThhZjZiZDI5N2Y1MWJiMWYzZTBhNjJjMzcwN2FkZTMzN2I5ZmI2YmZkOGE4ZmEzMDg0YTFkNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWNlZjM2YTIxNzE1MDA4YWJhNWU5Mjk2NTNmMjcyMDhjNjZiYjc5OGY0MGNiNmQzMzJkZmU0MzlkZGFjYWRjNTYyMmQ1YzAwOGY3NjU3MjQyMTcxMjA5NjdjYmU5MjQ4MGZmMzU2NmYxZDkyYzIxZGI4Y2E2ZjhlMGY5ZGYyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzOGEwMmJkZGY2ZWRhNWY4OWRjMTc5MjQ5M2JlZjMwNWQwYzg2OTlmYTVjZDFhNWQ0ZWZkOTgzNmZjNGU5ZjVlYjJkZGQ4NmYxM2NjMWI0NjcxNDQyM2U4ZjhhNTlkYTJlMDAzZDM4MmU1ZTg1YTBiNzM3OWY3YWMxYjNjMGI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODIzY2U5ZjYwMTFkMjUxMTRhZmZkZGM3ZmNjYzI5NzdlYmMxNTM0NzA3MGY2MjNlZGNlNTY0NzM2NDdjYjA5NGZjYjE3ZGI4MzBlNjk0ODNhNjE3ZjFmM2JhN2RjMWEzZDk1OGM5OThhMTcyYjY4MDExYzYzNGRiMjFlY2E1YTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWI4NWRiZTRjZDU5N2RiMjg1YWFkNTI0ZTIxNGNjOWE5MzY1MWRmM2Q4Nzg5MDBlY2NhNjk4N2M5MDFmNjg1MTg3ZWM1YTllMjYxZjg3YzYxMWVlYjdmYWJjODU1MzYzMjk1MzA2ZTliNTNmMWQ5N2Y0ZjZiMDJlNGJiZDMzZTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjJlZDM5MzhmMWVjMTgwOTYxZjk2MTFkODMzNDI2N2IyODlmOWY3YWMyMTdkYTU1NjE5MGU3NTdkODVlYzhjNWZiOTgxYzg1YzU1ZWQ2N2E2ODZiZjVmYTUyMDUzMDZhY2U1NzY5YTkyZThmN2FlZjE4ZjUxYTUwMDNjMTRkNGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjdiYmRlNjlhNjg1ODY2NzZhNTExMmY1NDJlNzk3ZjU4MDNkZmFkNTgyYTY2ZTBjZDYxNDU5ODg0OTU0MzkzOGYxYTg5MWI2OGU0NTk4MWQxMjIyMjg1NThhNmQwOWI2N2VhYWE0ZWYyYmMzMGJiMjhiNzgwZTgxYWY2MTI1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFmZmE4OGE2NjFiY2Q5MTc0OWMxYjRkZjVlYThmMmE3ZjhjNTM0OGI3ZDg0ZWFiMzNjNDA2ZDU2NjkyNmViOGNkNjVkNDYwZjIxMDg5ZmZlZmE5MzRjZDc0NTBhNzgzNjAyNzc0YWM3MGU2NTNhNDE1MTkxZDFiMzE2YTk1YmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQxMTFmMWI2YzE4OWU1MjBhY2UzNWVkOGUwYmJhNmFhNmQyMDdlZTg3ODFmNmE3Njk4ODEzZDU2MWM3ZWM5YWRmYTJjY2JmNGY4ZmE1MjE3NzVlZDJhMjEwYzQ0N2UwMTc0YjdhMzZlOGZmYmQwZjBlYzc3NzI3Y2RkMWM4MjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0ZTIwNjI2MzAyNzZmZWIzNTFkMWNkNDM3MzI0MzIwZWRkMDliOWUzYjI3N2I1Mjc4Nzc5ZTUxN2M5NWYwNjhmNmZjMzEzOGFhODI3OTA4MjBhOGZkMzg5OTA3NTNjNmUyZDJlNDQ2NTlkZDhlMjJlM2UzODEyYTU4YzczNGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjYjUzMmNiZTMyNmY4NmViNGNjZDM1Mjk5MTJiYWU1NTQ5MjI0OGE0NTU4OWE4MDcwNzJjNWMzODRiZjQ3NGM0ZDZlMTkwZGE0MzNmNTZiYmIyMGNhNjM2ZDYyNmI2YzBhY2E0NTc2NmRjYjJlMWQ2Nzk5ZWE5NDU5NTU4NjA5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhOTIzYzc4ODFkZTYwMTEwY2FhOTNlNmRmOWQwZDRmNzViZDUwZjkwYjM1YzgyM2JmM2ZhOGU1MTc3MDkyZTNjNzEyNzlmOTNkZGYyNTExNjYyZTQ5NjNiZWM3MmM0ZTk1OGE1MjI0YjJmNzY3ZDQxZTRjZGMxYzBiYjVkMTg2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjE3NzYxMmZkNzJlY2EwZTNlNWNjZTE4OTRjZDRiODQwYWRjMzQ0NTgwODk3Zjk3MDYyZDI3OGYwNTRjN2I3MzA0NWY1NDRiODM3ZDQ0YTM4YTc4NWE5ODIzZjU2MTdlYWEzMDg3ODJiOWMyYWZiMTgwZTMwZTAwNTk5MzNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1OTBmMzJkYTNlZjNjMzU2NjI0MDEyMGY1NjJmNTZmMDJhN2E0NWE3ZDJjOGZhMDFkNmYyNmE0MWE1NzFkNWQzYzU0ODEzMWYwOTExZGFiNmM1NWYzNTY3M2I2MmRhOTQ4MmQ0OTFkM2NjYzIwNDAwYWY2NmNhMmEyM2JmNmI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkMjlhNjhmZDJkNDk3MTc1NmRjYWQzNDdhYTViZjEyNGQyZDdmNGNmYmY3ZWI1NWMyM2M5NjQ5ODA0YWRjMjE4YWUzMDgwY2QxMjQwY2MzYWYxZjdmYzA0ZjVjMzA2MjI0MDZhNWMxYzFmMWY3MDg0ZDI3ZGQyZTU5OTZiZjUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGJlNmFhMjdhMGE2YjEyZDg2Njc4NTkxMDE4ZDEyZTljODgxYTc0ZmVkM2RkY2UxZTc3MzNlMjk5ODM1NjYwMDUyZGQ0MmQ5NmY2NWE0YmQ1NjZiMmExZmU4ZTJhZWY1ZWQ1M2ZiNDkwNTBiNzk5NDU5Yjc0NmQ0Njc1MjYwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNzNiYzExMDFhNWQxZTE4NjM4YzY5NGZlYTZlMDdlMTJmMDAxYzZiNDQ3YWQzMTBhNWYxMWQ2M2ZlNThiMTU5NDgzN2I5ZDQ5YTc4ZjNkMmFjM2M5OThlMDg0ZDk3ZTcwM2EzMmUwOWIyNjZkYzVjMjkyYzYyZGQzY2NlNWU0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NWQ2MzZhY2Y4OWUzYzBkMDg3Y2YxNTRiZDQzNDc2ZDk4NjBmZmM1MmQ3OWYxYzI5ZmQzYzg2ZWNiZTg2MGRmNmJjNjIyOGE0M2NhMzhhM2Q3NmQ5N2QxNTUwOTRhODk3Njk5Y2Q0ZjdhYTRkMmM1ZWIyZTIyYTY3ZTVkMmRhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzRjYTBlMWRhNWY0ZjgzZmJmY2Q1OWIzYjdhODhiZWRkNTk1OGNlYTZmNmMzYzgyN2U3NzQ5ZTFlMzFhOTE2MzA2Yzg4ZmM3MThlMmNkNDYwMjRiNGNlMTVmM2M3YTQxY2FjZmVmZGFhMDllMzQzZWYyOTJiYmE2NDkyMmQ1ODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTFmMGRmZDVlOTkzNzY2MmMyN2UxOTRhYzU5YTk4Y2VlMjJkNGQ5ODhkYWM1MThmOGI2YzY5YjYyMmFhMWY4NTYxNTZlYjc2ZTE0YmMzYzQzZmVhM2QwZDE4YjhiZTlhN2JkY2NlNzk0NjBkNThlOTM2MGQxNTYxOGJkMWQxZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1ODM5N2U4NmI0NjBjMGQ2MmQ3ODk4ZjljMzhhOTAzNDljMTJmYmI0NmQzY2ExMmQwZTgzZjg2YzM4ZTg2MDg5Njc4M2EyN2IzMzRhMzE0ODhlYzRkZmRjYjVjYjBkYWI0YzVhNTg5M2U0NDFjNzEwODhjMTliYTQ0MTczMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkNjc5Mjg3NTAwMWRlZGRhNTUxY2U5MjRlZjFhM2UyZDA2M2Q1Zjc3NmZjM2FkZjQ3NDJkMzM2MjJkNDUxYzU0NTUzNDY2ZWM4ZGY0MjhlMWU3M2JiMGQyNzQyMzIxNmU0MzlhYjE2ODUzNDk4M2E4OGU5MzhlOTRkOTFmMzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZmY5OGQ1MmVkZGYzOThjZjk2YWNiMTA1OWJlZDAyN2Y0ODZlNWJkZDcxYzA1NzZiMjhhZmEyMTE5ZGE2Yjg0MWMzODlkMDJiMzMxMDdkOGFiYTBhZWU0OTI1ZTYzZmI3YzM1OGE2YTQ1ZmE0YWMxYWU3NzY1ODAyMDU2YWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWZhYjE5Y2I5ZDczMjM3YmI2YzVmNTY4ZTU3ODY3NTFhN2FlZWY5NjYzZjJhMzBjNGI4ZjQ2NWUyMDEzOWYzZGEzNDZlYjJlNDEwMzg2ZjJkOTkyOWRmMzNjNTBmYThmMjQzNzMzZDc0ZjhiMGNmYzljOGI5ZjMxOGM0YWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlZGI2ZThhZjFjYzkxYzY2MzJhYjI2ZTU4NjkwOGM5N2NhNmYyNmM5N2VhZTEzNjZjMGYwNTc3OTc5MTEzYjE1YzViYTRiMzQzZDUxOWE5ZWQwNWRjZmMyMTA3OTAxNDhkN2E3YzY5ZDllNjYyNDQ2N2I2NTlkMGM2ZTI5MTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjODNhM2EzZTk2ZTZjNTlmMTllZWY1OWY3ZTQxN2RiNzViZjFlNmQxZGM3NmFhZGRkMmJlNDYzZTVmNGU0NzkyOWNjMWNiYjMzZjkxY2FiODZjMTc5NGY1Zjg0MDNiYzQ3ZTMzZTI2ZDExODYwM2M3ZDA1MjgxZjQ1MTdhNGFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAAe3aYBoLAAAaCwAAIwAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYWlsIiwiTm9uTnVsbGlzaCIsImFuIiwiYXNzZXJ0IiwiZGV0YWlscyIsImlkZW50Q2hlY2tlciIsIm1ha2VBc3NlcnQiLCJxIiwicXVvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhbiwgJ25hbWUnLCB7dmFsdWU6IFwiYW5cIn0pOyRo4oCNX29uY2UuYW4oYW4pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtBc3NlcnR9ICovXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7JGjigI1fb25jZS5nbG9iYWxBc3NlcnQoZ2xvYmFsQXNzZXJ0KTtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BhZ29yaWMvYXNzZXJ0J2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPVtcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4nLCAnKVxuIH1gKTtcblxuIH1cblxuY29uc3R7ZGV0YWlscyxGYWlsLHF1b3RlLG1ha2VBc3NlcnR9PWdsb2JhbEFzc2VydDskaOKAjV9vbmNlLmRldGFpbHMoZGV0YWlscyk7JGjigI1fb25jZS5GYWlsKEZhaWwpOyRo4oCNX29uY2UucXVvdGUocXVvdGUpOyRo4oCNX29uY2UubWFrZUFzc2VydChtYWtlQXNzZXJ0KTtcblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBOb25OdWxsaXNoPSh2YWwsb3B0RGV0YWlscz0gYHVuZXhwZWN0ZWQgJHtxdW90ZSh2YWwpfWApPT57XG5pZih2YWwhPW51bGwpe1xuLyogVGhpcyBgIT0gbnVsbGAgaWRpb20gY2hlY2tzIHRoYXQgYHZhbGAgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLiovXG5yZXR1cm4gdmFsO1xuIH1cbmFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xuIH07JGjigI1fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xuXG4vKipcbiAqIFByZXBlbmQgdGhlIGNvcnJlY3QgaW5kZWZpbml0ZSBhcnRpY2xlIG9udG8gYSBub3VuLCB0eXBpY2FsbHkgYSB0eXBlb2YgcmVzdWx0XG4gKiBlLmcuLCBcImFuIE9iamVjdFwiIHZzLiBcImEgTnVtYmVyXCJcbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbm91biB0byBwcmVwZW5kXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbm91biBwcmVwZW5kZWQgd2l0aCBhL2FuXG4gKi9cbmZ1bmN0aW9uIGFuKHN0cil7XG5zdHI9IGAke3N0cn1gO1xuaWYoc3RyLmxlbmd0aD49MSYmJ2FlaW91QUVJT1UnLmluY2x1ZGVzKHN0clswXSkpe1xucmV0dXJuIGBhbiAke3N0cn1gO1xuIH1cbnJldHVybiBgYSAke3N0cn1gO1xuIH1cbmZyZWV6ZShhbik7XG5cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRo4oCNX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnQiOlsiZ2xvYmFsQXNzZXJ0Il0sImRldGFpbHMiOlsiZGV0YWlscyJdLCJGYWlsIjpbIkZhaWwiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJtYWtlQXNzZXJ0IjpbIm1ha2VBc3NlcnQiXSwiYW4iOlsiYW4iXSwiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl0sImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4m9OmTgvAAA4LwAAIgAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogQmFzZWQgb24qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9TRVMtc2hpbS9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL3R5cGVzLmpzKi9cbi8qIENvb3JkaW5hdGUgZWRpdHMgdW50aWwgd2UgcmVmYWN0b3IgdG8gYXZvaWQgdGhpcyBkdXBsaWNhdGlvbiovXG4vKiBBdCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3NzQqL1xuLyogaXMgYSByZWNvcmQgb2YgYSBmYWlsZWQgYXR0ZW1wdCB0byByZW1vdmUgdGhpcyBkdXBsaWNhdGlvbi4qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCYXNlQXNzZXJ0XG4gKiBUaGUgYGFzc2VydGAgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSB7Kn0gZmxhZyBUaGUgdHJ1dGh5L2ZhbHN5IHZhbHVlXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZXJyb3JOYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0TWFrZUVycm9yXG4gKlxuICogVGhlIGBhc3NlcnQuZXJyb3JgIG1ldGhvZCwgcmVjb3JkaW5nIGRldGFpbHMgZm9yIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nLlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRGYWlsXG4gKlxuICogVGhlIGBhc3NlcnQuZmFpbGAgbWV0aG9kLlxuICpcbiAqIEZhaWwgYW4gYXNzZXJ0aW9uLCByZWNvcmRpbmcgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGgganVzdCB0eXBlIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIFR5cGUgYWxsIHRoZSBvdmVybG9hZHMgb2YgdGhlIGFzc2VydFR5cGVvZiBmdW5jdGlvbi4qL1xuLyogVGhlcmUgbWF5IGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCovXG4vKiB0aGVtcyB0aGUgYnJlYWtzIHdpdGggVHlwZXNjcmlwdCA0LjAuKi9cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJpZ2ludFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydiaWdpbnQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk51bWJlclxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydudW1iZXInfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3ltYm9sXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N5bWJvbCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnROb3RlXG4gKiBUaGUgYGFzc2VydC5ub3RlYCBtZXRob2QuXG4gKlxuICogQW5ub3RhdGUgdGhpcyBlcnJvciB3aXRoIHRoZXNlIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlLCBsaWtlIHRoZSBjYXVzYWwgY29uc29sZSBvZiBgY29uc29sZS5qc2AsIHRvXG4gKiBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBsb2dnZWQgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge0RldGFpbHN9IGRldGFpbHNOb3RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge3t9fSBEZXRhaWxzVG9rZW5cbiAqIEEgY2FsbCB0byB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgbWFrZXMgYW5kIHJldHVybnMgYSBmcmVzaCBkZXRhaWxzXG4gKiB0b2tlbiwgd2hpY2ggaXMgYSBmcm96ZW4gZW1wdHkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoYXRcbiAqIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIGV4cHJlc3Npb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgRGV0YWlsc1Rva2VufSBEZXRhaWxzXG4gKiBFaXRoZXIgYSBwbGFpbiBzdHJpbmcsIG9yIG1hZGUgYnkgdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIHRhZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0cmluZ2FibGVQYXlsb2FkXG4gKiBIb2xkcyB0aGUgcGF5bG9hZCBwYXNzZWQgdG8gcXVvdGUgc28gdGhhdCBpdHMgcHJpbnRlZCBmb3JtIGlzIHZpc2libGUuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gdG9TdHJpbmcgSG93IHRvIHByaW50IHRoZSBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBUbyBcImRlY2xhc3NpZnlcIiBhbmQgcXVvdGUgYSBzdWJzdGl0dXRpb24gdmFsdWUgdXNlZCBpbiBhXG4gKiBkZXRhaWxzYC4uLmAgdGVtcGxhdGUgbGl0ZXJhbCwgZW5jbG9zZSB0aGF0IHN1YnN0aXR1dGlvbiBleHByZXNzaW9uXG4gKiBpbiBhIGNhbGwgdG8gYHF1b3RlYC4gVGhpcyBzdGF0ZXMgdGhhdCB0aGUgYXJndW1lbnQgc2hvdWxkIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApLCBpbiB0aGUgZXJyb3IgbWVzc2FnZSBvZiB0aGUgdGhyb3duIGVycm9yLiBUaGVcbiAqIHBheWxvYWQgaXRzZWxmIGlzIHN0aWxsIHBhc3NlZCB1bnF1b3RlZCB0byB0aGUgY29uc29sZSBhcyBpdCB3b3VsZCBiZVxuICogd2l0aG91dCBgcXVvdGVgLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdGhlIGV4YW1wbGUgaW4gdGhlIGBkZXRhaWxzYCBjb21tZW50LCBzYXkgaW5zdGVhZCB0aGF0IHRoZVxuICogY29sb3IgdGhlIHNreSBpcyBzdXBwb3NlZCB0byBiZSBpcyBhbHNvIGNvbXB1dGVkLiBTYXkgdGhhdCB3ZSBzdGlsbCBkb24ndFxuICogd2FudCB0byByZXZlYWwgdGhlIHNreSdzIGFjdHVhbCBjb2xvciwgYnV0IHdlIGRvIHdhbnQgdGhlIHRocm93biBlcnJvcidzXG4gKiBtZXNzYWdlIHRvIHJldmVhbCB3aGF0IGNvbG9yIHRoZSBza3kgd2FzIHN1cHBvc2VkIHRvIGJlOlxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoY29sb3IpfWAsXG4gKiApO1xuICogYGBgXG4gKlxuICogVGhlIG5vcm1hbCBjb252ZW50aW9uIGlzIHRvIGxvY2FsbHkgcmVuYW1lIGBxdW90ZWAgdG8gYHFgIGFuZFxuICogYGRldGFpbHNgIHRvIGBYYFxuICogYGBganNcbiAqIGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcbiAqIGBgYFxuICogc28gdGhlIGFib3ZlIGV4YW1wbGUgd291bGQgdGhlbiBiZVxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgWGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UXVvdGVcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBXaGF0IHRvIGRlY2xhc3NpZnlcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gc3BhY2VzXG4gKiBAcmV0dXJucyB7U3RyaW5nYWJsZVBheWxvYWR9IFRoZSBkZWNsYXNzaWZpZWQgcGF5bG9hZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJhaXNlXG4gKlxuICogVG8gbWFrZSBhbiBgYXNzZXJ0YCB3aGljaCB0ZXJtaW5hdGVzIHNvbWUgbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb25cbiAqIGxpa2UgYSB0cmFuc2FjdGlvbiwgdmF0LCBvciBwcm9jZXNzLCBjYWxsIGBtYWtlQXNzZXJ0YCB3aXRoIGEgYFJhaXNlYFxuICogY2FsbGJhY2ssIHdoZXJlIHRoYXQgY2FsbGJhY2sgYWN0dWFsbHkgcGVyZm9ybXMgdGhhdCBsYXJnZXIgdGVybWluYXRpb24uXG4gKiBJZiBwb3NzaWJsZSwgdGhlIGNhbGxiYWNrIHNob3VsZCBhbHNvIHJlcG9ydCBpdHMgYHJlYXNvbmAgcGFyYW1ldGVyIGFzXG4gKiB0aGUgYWxsZWdlZCByZWFzb24gZm9yIHRoZSB0ZXJtaW5hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQXNzZXJ0XG4gKlxuICogTWFrZXMgYW5kIHJldHVybnMgYW4gYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHRoYXQgc2hhcmVzIHRoZSBib29ra2VlcGluZ1xuICogc3RhdGUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZSB3aXRoIG90aGVyIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdHMgbWFkZSBieVxuICogYG1ha2VBc3NlcnRgLiBUaGlzIHN0YXRlIGlzIHBlci1tb2R1bGUtaW5zdGFuY2UgYW5kIGlzIGV4cG9zZWQgYnkgdGhlXG4gKiBgbG9nZ2VkRXJyb3JIYW5kbGVyYCBhYm92ZS4gV2UgcmVmZXIgdG8gYGFzc2VydGAgYXMgYSBcImZ1bmN0aW9uIG9iamVjdFwiXG4gKiBiZWNhdXNlIGl0IGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgYSBmdW5jdGlvbiwgYnV0IGFsc28gaGFzIG1ldGhvZHMgdGhhdFxuICogY2FuIGJlIGNhbGxlZC5cbiAqXG4gKiBJZiBgb3B0UmFpc2VgIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuZWQgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHdpbGwgY2FsbFxuICogYG9wdFJhaXNlKHJlYXNvbilgIGJlZm9yZSB0aHJvd2luZyB0aGUgZXJyb3IuIFRoaXMgZW5hYmxlcyBgb3B0UmFpc2VgIHRvXG4gKiBlbmdhZ2UgaW4gZXZlbiBtb3JlIHZpb2xlbnQgdGVybWluYXRpb24gYmVoYXZpb3IsIGxpa2UgdGVybWluYXRpbmcgdGhlIHZhdCxcbiAqIHRoYXQgcHJldmVudHMgZXhlY3V0aW9uIGZyb20gcmVhY2hpbmcgdGhlIGZvbGxvd2luZyB0aHJvdy4gSG93ZXZlciwgaWZcbiAqIGBvcHRSYWlzZWAgcmV0dXJucyBub3JtYWxseSwgd2hpY2ggd291bGQgYmUgdW51c3VhbCwgdGhlIHRocm93IGZvbGxvd2luZ1xuICogYG9wdFJhaXNlKHJlYXNvbilgIHdvdWxkIHN0aWxsIGhhcHBlbi5cbiAqXG4gKiBAcGFyYW0ge1JhaXNlPX0gb3B0UmFpc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVucmVkYWN0ZWRcbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCB0aGUgcmVhbCBkZXRhaWxzIHRvXG4gKiB0aGUgY29uc29sZSBidXQgaW5jbHVkZSBvbmx5IHRoZSB0eXBlb2YgaW5mb3JtYXRpb24gaW4gdGhlIHRocm93biBlcnJvclxuICogdG8gcHJldmVudCByZXZlYWxpbmcgc2VjcmV0cyB1cCB0aGUgZXhjZXB0aW9uYWwgcGF0aC4gSW4gdGhlIGV4YW1wbGVcbiAqIGFib3ZlLCB0aGUgdGhyb3duIGVycm9yIG1heSByZXZlYWwgb25seSB0aGF0IGBza3kuY29sb3JgIGlzIGEgc3RyaW5nLFxuICogd2hlcmVhcyB0aGUgc2FtZSBkaWFnbm9zdGljIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgcmV2ZWFscyB0aGF0IHRoZVxuICogc2t5IHdhcyBncmVlbi5cbiAqXG4gKiBUaGUgYHJhd2AgbWVtYmVyIG9mIGEgYHRlbXBsYXRlYCBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYHN0cmluZ1tdYCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdGVtcGxhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IG5ldmVyfSBGYWlsVGFnXG4gKiBUaGUgYEZhaWxgIHRhbXBsYXRlIHRhZyBzdXBwb3J0cyByZXBsYWNpbmcgcGF0dGVybnMgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChjb25kLCBYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBvclxuICogYGBganNcbiAqIGNvbmQgfHwgYXNzZXJ0LmZhaWwoWGAuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICogd2l0aCBwYXR0ZXJucyBsaWtlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiBgYGBcbiAqXG4gKiBIb3dldmVyLCBkdWUgdG8gW3dlYWtuZXNzIGluIGN1cnJlbnRcbiAqIFR5cGVTY3JpcHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYpLCB0aGUgYHx8YFxuICogcGF0dGVybnMgYXJlIG5vdCBhcyBwb3dlcmZ1bCBhcyB0aGUgYGFzc2VydCguLi4pYCBjYWxsIGF0IGVuYWJsaW5nIHN0YXRpY1xuICogcmVhc29uaW5nLiBPZiB0aGUgYHx8YCwgYWdhaW4gZHVlIHRvIHdlYWtuZXNzZXMgaW4gY3VycmVudCBUeXBlU2NyaXB0LFxuICogdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmBcbiAqIGBgYFxuICogcGF0dGVybiBpcyBub3QgYXMgcG93ZXJmdWwgYXMgdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBhdCBlbmFibGluZyBzdGF0aWMgcmVzb25pbmcuIERlc3BpdGUgdGhlc2UgcHJvYmxlbXMsIHdlIGRvIG5vdCB3YW50IHRvXG4gKiByZXR1cm4gdG8gdGhlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmQsIFhgLi4uY29tcGxhaW50Li4uYClcbiAqIGBgYFxuICogc3R5bGUgYmVjYXVzZSBvZiB0aGUgc3Vic3RhbnRpYWwgb3ZlcmhlYWQgaW5cbiAqIGV2YWx1YXRpbmcgdGhlIGBYYCB0ZW1wbGF0ZSBpbiB0aGUgdHlwaWNhbCBgdHJ1ZWAgY2FzZSB3aGVyZSBpdCBpcyBub3RcbiAqIG5lZWRlZC4gQW5kIHdlIGRvIG5vdCB3YW50IHRvIHJldHVybiB0byB0aGVcbiAqIGBgYGpzXG4gKiBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApYFxuICogYGBgXG4gKiBiZWNhdXNlIG9mIHRoZSB2ZXJib3NpdHkgYW5kIGxvc3Mgb2YgcmVhZGFiaWxpdHkuIEluc3RlYWQsIHVudGlsL3VubGVzc1xuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiBpcyBmaXhlZCwgZm9yIHRob3NlXG4gKiBuZXctc3R5bGUgYXNzZXJ0aW9ucyB3aGVyZSB0aGlzIGxvc3Mgb2Ygc3RhdGljIHJlYXNvbmluZyBpcyBhIHByb2JsZW0sXG4gKiBpbnN0ZWFkIGV4cHJlc3MgdGhlIGFzc2VydGlvbiBhc1xuICogYGBganNcbiAqICAgaWYgKCFjb25kKSB7XG4gKiAgICAgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIG9yLCBpZiBuZWVkZWQsXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmQpIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZFxuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBUaGlzIGF2b2lkIHRoZSBUeXBlU2NyaXB0IGJ1Z3MgdGhhdCBjYXVzZSB0aGUgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nLFxuICogYnV0IHdpdGggbm8gbG9zcyBvZiBlZmZpY2llbmN5IGFuZCBsaXR0bGUgbG9zcyBvZiByZWFkYWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IGV4cHIgaXMgdHJ1dGh5LCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbHMgdG8gZGVzY3JpYmVcbiAqIHRoZSBhc3NlcnRpb24uIEl0IGlzIGEgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChleHByLCBkZXRhaWxzYC4uLi5gKTtgXG4gKiBgYGBcbiAqXG4gKiBUaGUgbGl0ZXJhbCBwb3J0aW9ucyBvZiB0aGUgdGVtcGxhdGUgYXJlIGFzc3VtZWQgbm9uLXNlbnNpdGl2ZSwgYXNcbiAqIGFyZSB0aGUgYHR5cGVvZmAgdHlwZXMgb2YgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIFRoZXNlIGFyZVxuICogYXNzZW1ibGVkIGludG8gdGhlIHRocm93biBlcnJvciBtZXNzYWdlLiBUaGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZVxuICogc3Vic3RpdHV0aW9uIHZhbHVlcyBhcmUgYXNzdW1lZCBzZW5zaXRpdmUsIHRvIGJlIHJldmVhbGVkIHRvXG4gKiB0aGUgY29uc29sZSBvbmx5LiBXZSBhc3N1bWUgb25seSB0aGUgdmlydHVhbCBwbGF0Zm9ybSdzIG93bmVyIGNhbiByZWFkXG4gKiB3aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUsIHdoZXJlIHRoZSBvd25lciBpcyBpbiBhIHByaXZpbGVnZWRcbiAqIHBvc2l0aW9uIG92ZXIgY29tcHV0YXRpb24gcnVubmluZyBvbiB0aGF0IHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHsgQmFzZUFzc2VydCAmIHtcbiAqICAgdHlwZW9mOiBBc3NlcnRUeXBlb2YsXG4gKiAgIGVycm9yOiBBc3NlcnRNYWtlRXJyb3IsXG4gKiAgIGZhaWw6IEFzc2VydEZhaWwsXG4gKiAgIGVxdWFsOiBBc3NlcnRFcXVhbCxcbiAqICAgc3RyaW5nOiBBc3NlcnRTdHJpbmcsXG4gKiAgIG5vdGU6IEFzc2VydE5vdGUsXG4gKiAgIGRldGFpbHM6IERldGFpbHNUYWcsXG4gKiAgIEZhaWw6IEZhaWxUYWcsXG4gKiAgIHF1b3RlOiBBc3NlcnRRdW90ZSxcbiAqICAgbWFrZUFzc2VydDogTWFrZUFzc2VydCxcbiAqIH0gfSBBc3NlcnRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZEh3gDjcAAA43AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBraW5kcyBvZiBhc3NldHMgd2Ugc3VwcG9ydC5cbiAqXG4gKiBAdHlwZSB7eyBOQVQ6ICduYXQnLCBTRVQ6ICdzZXQnLCBDT1BZX1NFVDogJ2NvcHlTZXQnLCBDT1BZX0JBRzogJ2NvcHlCYWcnIH19XG4gKi9cbmNvbnN0IEFzc2V0S2luZD1oYXJkZW4oe1xuTkFUOiduYXQnLFxuU0VUOidzZXQnLFxuQ09QWV9TRVQ6J2NvcHlTZXQnLFxuQ09QWV9CQUc6J2NvcHlCYWcnfSk7JGjigI1fb25jZS5Bc3NldEtpbmQoQXNzZXRLaW5kKTtcblxuY29uc3QgYXNzZXRLaW5kTmFtZXM9aGFyZGVuKE9iamVjdC52YWx1ZXMoQXNzZXRLaW5kKS5zb3J0KCkpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYWxsZWdlZEFLXG4gKi9cbmNvbnN0IGFzc2VydEFzc2V0S2luZD0oYWxsZWdlZEFLKT0+e1xuYXNzZXRLaW5kTmFtZXMuaW5jbHVkZXMoYWxsZWdlZEFLKXx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YCk7XG5cbiB9OyRo4oCNX29uY2UuYXNzZXJ0QXNzZXRLaW5kKGFzc2VydEFzc2V0S2luZCk7XG5oYXJkZW4oYXNzZXJ0QXNzZXRLaW5kKTtcblxuLyoqXG4gKiBBbW91bnRzIGRlc2NyaWJlIGRpZ2l0YWwgYXNzZXRzLiBGcm9tIGFuIGFtb3VudCwgeW91IGNhbiBsZWFybiB0aGVcbiAqIGJyYW5kIG9mIGRpZ2l0YWwgYXNzZXQgYXMgd2VsbCBhcyBcImhvdyBtdWNoXCIgb3IgXCJob3cgbWFueVwiLiBBbW91bnRzXG4gKiBoYXZlIHR3byBwYXJ0czogYSBicmFuZCAobG9vc2VseSBzcGVha2luZywgdGhlIHR5cGUgb2YgZGlnaXRhbFxuICogYXNzZXQpIGFuZCB0aGUgdmFsdWUgKHRoZSBhbnN3ZXIgdG8gXCJob3cgbXVjaFwiKS4gRm9yIGV4YW1wbGUsIGluXG4gKiB0aGUgcGhyYXNlIFwiNSBidWNrc1wiLCBcImJ1Y2tzXCIgdGFrZXMgdGhlIHJvbGUgb2YgdGhlIGJyYW5kIGFuZCB0aGVcbiAqIHZhbHVlIGlzIDUuIEFtb3VudHMgY2FuIGRlc2NyaWJlIGZ1bmdpYmxlIGFuZCBub24tZnVuZ2libGUgZGlnaXRhbFxuICogYXNzZXRzLiBBbW91bnRzIGFyZSBwYXNzLWJ5LWNvcHkgYW5kIGNhbiBiZSBtYWRlIGJ5IGFuZCBzZW50IHRvXG4gKiBhbnlvbmUuXG4gKlxuICogVGhlIGlzc3VlciBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2Ugb2YgdGhlIGFtb3VudCBpbiBwYXltZW50c1xuICogYW5kIHB1cnNlcy4gVGhlIGlzc3VlciBtdXN0IGJlIGFibGUgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgYWRkXG4gKiBkaWdpdGFsIGFzc2V0cyB0byBhIHB1cnNlIGFuZCB3aXRoZHJhdyBkaWdpdGFsIGFzc2V0cyBmcm9tIGEgcHVyc2UuXG4gKiBUbyBkbyBzbywgaXQgbXVzdCBrbm93IGhvdyB0byBhZGQgYW5kIHN1YnRyYWN0IGRpZ2l0YWwgYXNzZXRzLlxuICogUmF0aGVyIHRoYW4gaGFyZC1jb2RpbmcgYSBwYXJ0aWN1bGFyIHNvbHV0aW9uLCB3ZSBjaG9zZSB0b1xuICogcGFyYW1ldGVyaXplIHRoZSBpc3N1ZXIgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcG9seW1vcnBoaWMgZnVuY3Rpb25zLFxuICogd2hpY2ggd2UgY2FsbCBgQW1vdW50TWF0aGAuIFRoZXNlIG1hdGggZnVuY3Rpb25zIGluY2x1ZGUgY29uY2VwdHNcbiAqIGxpa2UgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLlxuICpcbiAqIFdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29uZnVzaW9uIGFzIHRvIHdoYXQga2luZCBvZlxuICogYXNzZXQgd2UgYXJlIHVzaW5nLiBUaHVzLCBBbW91bnRNYXRoIGluY2x1ZGVzIGNoZWNrcyBvZiB0aGVcbiAqIGBicmFuZGAsIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldC4gSWZcbiAqIHRoZSB3cm9uZyBicmFuZCBpcyB1c2VkIGluIEFtb3VudE1hdGgsIGFuIGVycm9yIGlzIHRocm93biBhbmQgdGhlXG4gKiBvcGVyYXRpb24gZG9lcyBub3Qgc3VjY2VlZC5cbiAqXG4gKiBBbW91bnRNYXRoIHVzZXMgbWF0aEhlbHBlcnMgdG8gZG8gbW9zdCBvZiB0aGUgd29yaywgYnV0IHRoZW4gYWRkc1xuICogdGhlIGJyYW5kIHRvIHRoZSByZXN1bHQuIFRoZSBmdW5jdGlvbiBgdmFsdWVgIGdldHMgdGhlIHZhbHVlIGZyb21cbiAqIHRoZSBhbW91bnQgYnkgcmVtb3ZpbmcgdGhlIGJyYW5kIChhbW91bnQgLT4gdmFsdWUpLCBhbmQgdGhlXG4gKiBmdW5jdGlvbiBgbWFrZWAgYWRkcyB0aGUgYnJhbmQgdG8gcHJvZHVjZSBhbiBhbW91bnQgKHZhbHVlIC0+XG4gKiBhbW91bnQpLiBUaGUgZnVuY3Rpb24gYGNvZXJjZWAgdGFrZXMgYW4gYW1vdW50IGFuZCBjaGVja3MgaXQsXG4gKiByZXR1cm5pbmcgYW4gYW1vdW50IChhbW91bnQgLT4gYW1vdW50KS5cbiAqXG4gKiBFYWNoIGlzc3VlciBvZiBkaWdpdGFsIGFzc2V0cyBoYXMgYW4gYXNzb2NpYXRlZCBicmFuZCBpbiBhXG4gKiBvbmUtdG8tb25lIG1hcHBpbmcuIEluIHVudHJ1c3RlZCBjb250ZXh0cywgc3VjaCBhcyBpbiBhbmFseXppbmdcbiAqIHBheW1lbnRzIGFuZCBhbW91bnRzLCB3ZSBjYW4gZ2V0IHRoZSBicmFuZCBhbmQgZmluZCB0aGUgaXNzdWVyXG4gKiB3aGljaCBtYXRjaGVzIHRoZSBicmFuZC4gVGhlIGlzc3VlciBhbmQgdGhlIGJyYW5kIG11dHVhbGx5IHZhbGlkYXRlXG4gKiBlYWNoIG90aGVyLlxuICovXG5cbmNvbnN0IGhlbHBlcnM9e1xubmF0Om5hdE1hdGhIZWxwZXJzLFxuc2V0OnNldE1hdGhIZWxwZXJzLFxuY29weVNldDpjb3B5U2V0TWF0aEhlbHBlcnMsXG5jb3B5QmFnOmNvcHlCYWdNYXRoSGVscGVyc307XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZSB7KHZhbHVlOiBWKSA9PiBBc3NldEtpbmRGb3JWYWx1ZTxWPn1cbiAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQ9KHZhbHVlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbHVlKTtcbmlmKHBhc3NTdHlsZT09PSdiaWdpbnQnKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nbmF0JztcbiB9XG5pZihwYXNzU3R5bGU9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ3NldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLnNldCgpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlTZXQnO1xuIH1cbmlmKG1hdGNoZXModmFsdWUsTS5iYWcoKSkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidjb3B5QmFnJztcbiB9XG5hc3NlcnQuZmFpbChcbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cblggYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtwYXNzU3R5bGV9YCk7XG5cbiB9O1xuXG4vKipcbiAqXG4gKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgYSB2YWxpZCBBbW91bnRNYXRoIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBoZWxwZXJzLlxuICpcbiAqIE1hZGUgYXZhaWxhYmxlIG9ubHkgZm9yIHRlc3RpbmcsIGJ1dCBpdCBpcyBoYXJtbGVzcyBmb3Igb3RoZXIgdXNlcy5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAcGFyYW0ge1Z9IHZhbHVlXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Vj59XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRWYWx1ZUdldEhlbHBlcnM9KHZhbHVlKT0+XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKiogQHR5cGUgeyhhbGxlZ2VkQnJhbmQ6IEJyYW5kLCBicmFuZD86IEJyYW5kKSA9PiB2b2lkfSAqLyRo4oCNX29uY2UuYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFzc2VydFZhbHVlR2V0SGVscGVycyk7XG5jb25zdCBvcHRpb25hbEJyYW5kQ2hlY2s9KGFsbGVnZWRCcmFuZCxicmFuZCk9PntcbmlmKGJyYW5kIT09dW5kZWZpbmVkKXtcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydC5lcXVhbChcbmFsbGVnZWRCcmFuZCxcbmJyYW5kLFxuWCBgYW1vdW50J3MgYnJhbmQgJHthbGxlZ2VkQnJhbmR9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHticmFuZH1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+IHwgdW5kZWZpbmVkfSBicmFuZFxuICogQHJldHVybnMge01hdGhIZWxwZXJzPCo+fVxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycz0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQobGVmdEFtb3VudCwnbGVmdEFtb3VudCcpO1xuYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCdyaWdodEFtb3VudCcpO1xuY29uc3R7dmFsdWU6bGVmdFZhbHVlLGJyYW5kOmxlZnRCcmFuZH09bGVmdEFtb3VudDtcbmNvbnN0e3ZhbHVlOnJpZ2h0VmFsdWUsYnJhbmQ6cmlnaHRCcmFuZH09cmlnaHRBbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCdsZWZ0QnJhbmQnKTtcbmFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCdyaWdodEJyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLGJyYW5kKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLGJyYW5kKTtcbmFzc2VydC5lcXVhbChcbmxlZnRCcmFuZCxcbnJpZ2h0QnJhbmQsXG5YIGBCcmFuZHMgaW4gbGVmdCAke2xlZnRCcmFuZH0gYW5kIHJpZ2h0ICR7cmlnaHRCcmFuZH0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgKTtcblxuY29uc3QgbGVmdEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG5jb25zdCByaWdodEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdEhlbHBlcnMsXG5yaWdodEhlbHBlcnMsXG5YIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYCk7XG5cbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmRcbiAqIHBheW1lbnRzLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGluZ3MgbGlrZSBjdXJyZW5jeSwgc3RvY2ssIGFuZCB0aGVcbiAqIGFic3RyYWN0IHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBleGNoYW5nZS5cbiAqL1xuY29uc3QgQW1vdW50TWF0aD17XG4vKipcbiAqIE1ha2UgYW4gYW1vdW50IGZyb20gYSB2YWx1ZSBieSBhZGRpbmcgdGhlIGJyYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBc3NldFZhbHVlRm9yS2luZDxLPn0gYWxsZWdlZFZhbHVlXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG4vKiBhbGxlZ2VkVmFsdWUgaGFzIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBmb3IgdHlwZSB3aWRlbmluZywgdG8gcHJldmVudCBWIGJlaW5nIGJvdW5kIHRvIGEgYSBsaXRlcmFsIGxpa2UgMW4qL1xubWFrZTooYnJhbmQsYWxsZWdlZFZhbHVlKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbmNvbnN0IHZhbHVlPWguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogTWFrZSBzdXJlIHRoaXMgYW1vdW50IGlzIHZhbGlkIGVub3VnaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmdcbiAqIHZhbGlkIGFtb3VudCBpZiBzby5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbGxlZ2VkQW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5jb2VyY2U6KGJyYW5kLGFsbGVnZWRBbW91bnQpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWU6YWxsZWdlZFZhbHVlfT1hbGxlZ2VkQW1vdW50O1xuYnJhbmQ9PT1hbGxlZ2VkQnJhbmR8fFxuYXNzZXJ0LmZhaWwoXG5YIGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gKTtcblxuLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsYWxsZWdlZFZhbHVlKTtcbiB9LFxuLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fVxuICovXG5nZXRWYWx1ZTooYnJhbmQsYW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYW1vdW50KS52YWx1ZSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGVcbiAqIGlkZW50aXR5IGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZCwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xubWFrZUVtcHR5OihicmFuZCxhc3NldEtpbmQ9LyoqIEB0eXBlIHtjb25zdH0gKi8nbmF0Jyk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuY29uc3QgdmFsdWU9aGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXJcbiAqIGFtb3VudCBhcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYWtlRW1wdHlGcm9tQW1vdW50OihhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kLHZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ9fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxuICogcmlnaHRBbW91bnQuIEZvciBub24tc2NhbGFycywgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzXG4gKiBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSxcbiAqIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGVcbiAqIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieSB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzR1RFOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWVcbiAqIHRoYXQgaWYgaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRXF1YWw6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBib3RoIGxlZnRBbW91bnQgYW5kIHJpZ2h0QW1vdW50LlxuICpcbiAqIEZvciBmdW5naWJsZSBhbW91bnQgdGhpcyBtZWFucyBhZGRpbmcgdGhlIHZhbHVlcy4gRm9yIG90aGVyIGtpbmRzIG9mXG4gKiBhbW91bnQsIGl0IHVzdWFsbHkgbWVhbnMgaW5jbHVkaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSBib3RoXG4gKiBsZWZ0IGFuZCByaWdodC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5hZGQ6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9BZGQoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnRcbiAqIChpLmUuIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlXG4gKiByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnQgZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50XG4gKiAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgIGFuIGVycm9yLiBCZWNhdXNlIHRoZVxuICogbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UIGVxdWl2YWxlbnRcbiAqIHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1pbjooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PkFtb3VudE1hdGguaXNHVEUoeCx5LGJyYW5kKT95OngsXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PkFtb3VudE1hdGguaXNHVEUoeCx5LGJyYW5kKT94Onl9OyRo4oCNX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcblxuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGwopzTyBQAA8gUAACcAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LFgsZml0LERpc3BsYXlJbmZvU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJkZXRhaWxzXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZURpc3BsYXlJbmZvPShhbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kKT0+e1xuZml0KGFsbGVnZWREaXNwbGF5SW5mbyxEaXNwbGF5SW5mb1NoYXBlLCdkaXNwbGF5SW5mbycpO1xuXG5pZihhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kIT09dW5kZWZpbmVkKXtcbmFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQ9PT1hc3NldEtpbmR8fFxuYXNzZXJ0LmZhaWwoXG5YIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgKTtcblxuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbmFzc2VydC5mYWlsKFxuWCBgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuXG4gfVxuXG5yZXR1cm4gZGlzcGxheUluZm87XG4gfTskaOKAjV9vbmNlLmNvZXJjZURpc3BsYXlJbmZvKGNvZXJjZURpc3BsYXlJbmZvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJvSw40wEAANMBAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW11dLFtcIi4vaXNzdWVyS2l0LmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANpYetwzGwAAMxsAACUAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vZGlzcGxheUluZm8uanMiLCIuL3BheW1lbnRMZWRnZXIuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0Iiwidml2aWZ5SXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHZpdmlmeVBheW1lbnRMZWRnZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIiwgWyRo4oCNX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1widml2aWZ5UGF5bWVudExlZGdlclwiLCBbJGjigI1fYSA9PiAodml2aWZ5UGF5bWVudExlZGdlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZT19IG9wdFNodXRkb3duV2l0aEZhaWx1cmUgSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlJc3N1ZXJLaXQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBuYW1lPWlzc3VlckJhZ2dhZ2UuZ2V0KCduYW1lJyk7XG4vKiogQHR5cGUge0t9ICovXG5jb25zdCBhc3NldEtpbmQ9aXNzdWVyQmFnZ2FnZS5nZXQoJ2Fzc2V0S2luZCcpO1xuY29uc3QgZGlzcGxheUluZm89aXNzdWVyQmFnZ2FnZS5nZXQoJ2Rpc3BsYXlJbmZvJyk7XG5jb25zdCBlbGVtZW50U2hhcGU9aXNzdWVyQmFnZ2FnZS5nZXQoJ2VsZW1lbnRTaGFwZScpO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4vKiBBZGQgYXNzZXRLaW5kIHRvIGRpc3BsYXlJbmZvLCBvciBvdmVycmlkZSBpZiBwcmVzZW50Ki9cbmNvbnN0IGNsZWFuRGlzcGxheUluZm89Y29lcmNlRGlzcGxheUluZm8oZGlzcGxheUluZm8sYXNzZXRLaW5kKTtcbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlLCdmdW5jdGlvbicpO1xuIH1cblxuaWYoZWxlbWVudFNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oZWxlbWVudFNoYXBlKTtcbiB9XG5cbi8qIEF0dGVudWF0ZSB0aGUgcG93ZXJmdWwgYXV0aG9yaXR5IHRvIG1pbnQgYW5kIGNoYW5nZSBiYWxhbmNlcyovXG4vKiogQHR5cGUge1BheW1lbnRMZWRnZXI8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5jb25zdHtpc3N1ZXIsbWludCxicmFuZH09dml2aWZ5UGF5bWVudExlZGdlcihcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuY2xlYW5EaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYnJhbmQsXG5pc3N1ZXIsXG5taW50LFxuZGlzcGxheUluZm86Y2xlYW5EaXNwbGF5SW5mb30pO1xuXG4gfTskaOKAjV9vbmNlLnZpdmlmeUlzc3VlcktpdCh2aXZpZnlJc3N1ZXJLaXQpO1xuaGFyZGVuKHZpdmlmeUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPUFzc2V0S2luZC5OQVRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtQYXJ0aWFsPHtlbGVtZW50U2hhcGU6IFBhdHRlcm59Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUR1cmFibGVJc3N1ZXJLaXQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG4vKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuYXNzZXRLaW5kPUFzc2V0S2luZC5OQVQsXG5kaXNwbGF5SW5mbz1oYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQsXG57ZWxlbWVudFNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnbmFtZScsbmFtZSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ2Fzc2V0S2luZCcsYXNzZXRLaW5kKTtcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnZGlzcGxheUluZm8nLGRpc3BsYXlJbmZvKTtcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnZWxlbWVudFNoYXBlJyxlbGVtZW50U2hhcGUpO1xucmV0dXJuIHZpdmlmeUlzc3VlcktpdChpc3N1ZXJCYWdnYWdlLG9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuIH07JGjigI1fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz0nbmF0J11cbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZD0nbmF0J11cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSXNzdWVyS2l0PShcbm5hbWUsXG4vKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuYXNzZXRLaW5kPUFzc2V0S2luZC5OQVQsXG5kaXNwbGF5SW5mbz1oYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQsXG57ZWxlbWVudFNoYXBlPXVuZGVmaW5lZH09e30pPT5cblxubWFrZUR1cmFibGVJc3N1ZXJLaXQoXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ2Ryb3BwZWQgaXNzdWVyIGtpdCcse2R1cmFibGU6dHJ1ZX0pLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbntlbGVtZW50U2hhcGV9KTskaOKAjV9vbmNlLm1ha2VJc3N1ZXJLaXQobWFrZUlzc3VlcktpdCk7XG5cbmhhcmRlbihtYWtlSXNzdWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlJc3N1ZXJLaXQiOlsidml2aWZ5SXNzdWVyS2l0Il0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAApLuyRjAUAAIwFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxmaXQsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ1ZhbHVlfSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlCYWcoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5QmFnVmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgY29weUJhZ01hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooYmFnKT0+e1xuZml0KGJhZyxNLmJhZygpLCdiYWcgb2YgYW1vdW50Jyk7XG5yZXR1cm4gYmFnO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGJhZyk9PmdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoPT09MCxcbmRvSXNHVEU6YmFnSXNTdXBlcmJhZyxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOmJhZ1VuaW9uLFxuZG9TdWJ0cmFjdDpiYWdEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOWIulyZBQAAmQUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5U2V0LGZpdCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weVNldChbXSk7XG5cbi8qKlxuICogQHR5cGUge0NvcHlTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9PntcbmZpdChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF+1eMQcBgAAHAYAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvbmF0Il0sImV4cG9ydHMiOlsibmF0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGlzTmF0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV0sW1wiaXNOYXRcIiwgWyRo4oCNX2EgPT4gKGlzTmF0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0IGVtcHR5PTBuO1xuXG4vKipcbiAqIEZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHVzZSB0aGUgbmF0TWF0aEhlbHBlcnMgdG8gbWFuYWdlIGJhbGFuY2VzIC1cbiAqIHRoZSBvcGVyYXRpb25zIGFyZSBtZXJlbHkgYXJpdGhtZXRpYyBvbiBuYXR1cmFsLCBub24tbmVnYXRpdmVcbiAqIG51bWJlcnMuXG4gKlxuICogTmF0dXJhbCBudW1iZXJzIGFyZSB1c2VkIGZvciBmdW5naWJsZSBlcmlnaHRzIHN1Y2ggYXMgbW9uZXkgYmVjYXVzZVxuICogcm91bmRpbmcgaXNzdWVzIG1ha2UgZmxvYXRzIHByb2JsZW1hdGljLiBBbGwgb3BlcmF0aW9ucyBzaG91bGQgYmVcbiAqIGRvbmUgd2l0aCB0aGUgc21hbGxlc3Qgd2hvbGUgdW5pdCBzdWNoIHRoYXQgdGhlIE5hdE1hdGhIZWxwZXJzIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuYXNzZXJ0KGlzTmF0KG5hdCksWCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmApO1xucmV0dXJuIE5hdChuYXQpO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KG5hdCk9Pm5hdD09PWVtcHR5LFxuZG9Jc0dURToobGVmdCxyaWdodCk9PmxlZnQ+PXJpZ2h0LFxuZG9Jc0VxdWFsOihsZWZ0LHJpZ2h0KT0+bGVmdD09PXJpZ2h0LFxuLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbmRvQWRkOihsZWZ0LHJpZ2h0KT0+bGVmdCtyaWdodCxcbmRvU3VidHJhY3Q6KGxlZnQscmlnaHQpPT5OYXQobGVmdC1yaWdodCl9KTskaOKAjV9vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRNYXRoSGVscGVycyI6WyJuYXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACRgLmufwcAAH8HAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dLFtcImNvZXJjZVRvRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7U2V0TWF0aEhlbHBlcnN9XG4gKi9cbmNvbnN0ICAgICAgICBzZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KGxpc3QpPT57XG5saXN0PWNvZXJjZVRvRWxlbWVudHMobGlzdCk7XG4vKiBBc3NlcnQgdGhhdCBsaXN0IGNvbnRhaW5zIG9ubHkqL1xuLyogKiBwYXNzLWJ5LWNvcHkgcHJpbWl0aXZlcywqL1xuLyogKiBwYXNzLWJ5LWNvcHkgY29udGFpbmVycyBjb250YWluaW5nIGtleXMsKi9cbi8qICogcmVtb3RhYmxlcy4qL1xuYXNzZXJ0S2V5KGxpc3QpO1xucmV0dXJuIGxpc3Q7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobGlzdCk9PnBhc3NTdHlsZU9mKGxpc3QpPT09J2NvcHlBcnJheScmJmxpc3QubGVuZ3RoPT09MCxcbmRvSXNHVEU6ZWxlbWVudHNJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOih4LHkpPT5lbGVtZW50c0NvbXBhcmUoeCx5KT09PTAsXG5kb0FkZDplbGVtZW50c0Rpc2pvaW50VW5pb24sXG5kb1N1YnRyYWN0OmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldE1hdGhIZWxwZXJzIjpbInNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAARUPyuBBAAAgQQAACMAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbInZpdmlmeVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSx2aXZpZnlGYXJDbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJ2aXZpZnlGYXJDbGFzc1wiLCBbJGjigI1fYSA9PiAodml2aWZ5RmFyQ2xhc3MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlQYXltZW50S2luZD0oaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKT0+e1xuY29uc3QgbWFrZVBheW1lbnQ9dml2aWZ5RmFyQ2xhc3MoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IHBheW1lbnRgLFxuUGF5bWVudEksXG5pbml0RW1wdHksXG57XG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9fSk7XG5cblxucmV0dXJuIG1ha2VQYXltZW50O1xuIH07JGjigI1fb25jZS52aXZpZnlQYXltZW50S2luZCh2aXZpZnlQYXltZW50S2luZCk7XG5oYXJkZW4odml2aWZ5UGF5bWVudEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeVBheW1lbnRLaW5kIjpbInZpdmlmeVBheW1lbnRLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKQ7p4ffPAAA3zwAACkAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudExlZGdlci5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsidml2aWZ5UGF5bWVudExlZGdlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q29weUFycmF5LGZpdCxNLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHZpdmlmeUZhckluc3RhbmNlLEFtb3VudE1hdGgsdml2aWZ5UGF5bWVudEtpbmQsdml2aWZ5UHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q29weUFycmF5XCIsIFskaOKAjV9hID0+IChhc3NlcnRDb3B5QXJyYXkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiLCBbJGjigI1fYSA9PiAodml2aWZ5RmFySW5zdGFuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1widml2aWZ5UGF5bWVudEtpbmRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeVBheW1lbnRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vcHVyc2UuanNcIiwgW1tcInZpdmlmeVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAodml2aWZ5UHVyc2VLaW5kID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRJXCIsIFskaOKAjV9hID0+IChCcmFuZEkgPSAkaOKAjV9hKV1dLFtcIm1ha2VJc3N1ZXJJbnRlcmZhY2VzXCIsIFskaOKAjV9hID0+IChtYWtlSXNzdWVySW50ZXJmYWNlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlPShicmFuZCxhc3NldEtpbmQsZWxlbWVudFNoYXBlKT0+e1xubGV0IHZhbHVlU2hhcGU7XG5zd2l0Y2goYXNzZXRLaW5kKXtcbmNhc2UnbmF0Jzp7XG52YWx1ZVNoYXBlPU0ubmF0KCk7XG5lbGVtZW50U2hhcGU9PT11bmRlZmluZWR8fFxuYXNzZXJ0LmZhaWwoXG5YIGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gKTtcblxuYnJlYWs7XG4gfVxuY2FzZSdzZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0uYW5kKE0ua2V5KCksZWxlbWVudFNoYXBlKSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5U2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLnNldCgpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmJhZygpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YCk7XG4gfX1cblxuXG5jb25zdCBhbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQsLyogbWF0Y2hlcyBvbmx5IHRoaXMgZXhhY3QgYnJhbmQqL1xudmFsdWU6dmFsdWVTaGFwZX0pO1xuXG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfTtcblxuLyoqXG4gKiBNYWtlIHRoZSBwYXltZW50TGVkZ2VyLCB0aGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgYmFsYW5jZXMgb2ZcbiAqIHBheW1lbnRzLiBBbGwgbWludGluZyBhbmQgdHJhbnNmZXIgYXV0aG9yaXR5IG9yaWdpbmF0ZXMgaGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7RGlzcGxheUluZm88Sz59IGRpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbmNvbnN0IGJyYW5kPXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBlbXB0eUFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuY29uc3QgYW1vdW50U2hhcGU9YW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5lbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0e0lzc3VlckksTWludEksUGF5bWVudEksUHVyc2VJS2l0fT1tYWtlSXNzdWVySW50ZXJmYWNlcyhcbmJyYW5kLFxuYXNzZXRLaW5kLFxuYW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0IG1ha2VQYXltZW50PXZpdmlmeVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInKTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCJcbiAqIHBheW1lbnRzLiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmVcbiAqIHBheW1lbnRzIGFyZSByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5XG4gKiB3aXRoIHRoaXMgd2Vha21hcCBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmVcbiAqIGluLlxuICogQSBidW5jaCBvZiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKiAgICAqIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgXG4gKiAgICAgIHdlYWtNYXAgaXMgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogICAgKiBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seVxuICogICAgICBpbiBhdCBtb3N0IG9uZSByZWNvdmVyeSBzZXQuXG4gKiAgICAqIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqICAgICogRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG9cbiAqICAgICAgaXQuXG4gKiAgICAqIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbVxuICogICAgICB0aGF0IHB1cnNlIGFuZCBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudCB9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IHN1YnRyYWN0PShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5zdWJ0cmFjdChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW4gfSAqL1xuY29uc3QgaXNFcXVhbD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguaXNFcXVhbChsZWZ0LHJpZ2h0LGJyYW5kKTtcblxuLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlclxuICogYG9wdEFtb3VudFNoYXBlYFxuICogd2hpY2gsIGlmIHByZXNlbnQsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBiYWxhbmNlIG9mIHRoZVxuICogcGF5bWVudC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZG9lcyB0aGF0IGNoZWNrLlxuICpcbiAqIE5vdGU6IGBvcHRBbW91bnRTaGFwZWAgaXMgdXNlci1zdXBwbGllZCB3aXRoIG5vIHByZXZpb3VzIHZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHBheW1lbnRCYWxhbmNlXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbmFzc2VydC5mYWlsKFxuWCBgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG5icmFuZClcbiB9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gKTtcblxuIH07XG5cbi8qKlxuICogUmVhbGxvY2F0ZSBhc3NldHMgZnJvbSB0aGUgYHBheW1lbnRzYCBwYXNzZWQgaW4gdG8gbmV3IHBheW1lbnRzXG4gKiBjcmVhdGVkIGFuZCByZXR1cm5lZCwgd2l0aCBiYWxhbmNlcyBmcm9tIGBuZXdQYXltZW50QmFsYW5jZXNgLlxuICogRW5mb3JjZXMgdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIG9ubHkgb3BlcmF0aW9uIHRoYXQgbW92ZXMgYXNzZXRzLlxuICogYHB1cnNlLmRlcG9zaXRgIGFuZCBgcHVyc2Uud2l0aGRyYXdgIG1vdmUgYXNzZXRzIGJldHdlZW4gYSBwdXJzZSBhbmRcbiAqIGEgcGF5bWVudCwgYW5kIHNvIG11c3QgYWxzbyBlbmZvcmNlIGNvbnNlcnZhdGlvbiB0aGVyZS5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnRbXX0gcGF5bWVudHNcbiAqIEBwYXJhbSB7QW1vdW50W119IG5ld1BheW1lbnRCYWxhbmNlc1xuICogQHJldHVybnMge1BheW1lbnRbXX1cbiAqL1xuY29uc3QgbW92ZUFzc2V0cz0ocGF5bWVudHMsbmV3UGF5bWVudEJhbGFuY2VzKT0+e1xuYXNzZXJ0Q29weUFycmF5KHBheW1lbnRzLCdwYXltZW50cycpO1xuYXNzZXJ0Q29weUFycmF5KG5ld1BheW1lbnRCYWxhbmNlcywnbmV3UGF5bWVudEJhbGFuY2VzJyk7XG5cbi8qIFRoZXJlIG1heSBiZSB6ZXJvLCBvbmUsIG9yIG1hbnkgcGF5bWVudHMgYXMgaW5wdXQgdG8qL1xuLyogbW92ZUFzc2V0cy4gV2Ugd2FudCB0byBwcm90ZWN0IGFnYWluc3Qgc29tZW9uZSBwYXNzaW5nIGluKi9cbi8qIHdoYXQgYXBwZWFycyB0byBiZSBtdWx0aXBsZSBwYXltZW50cyB0aGF0IHR1cm4gb3V0IHRvIGFjdHVhbGx5Ki9cbi8qIGJlIHRoZSBzYW1lIHBheW1lbnQgKGFuIGFsaWFzaW5nIGlzc3VlKS4gVGhlIGBjb21iaW5lYCBtZXRob2QqL1xuLyogbGVnaXRpbWF0ZWx5IG5lZWRzIHRvIHRha2UgaW4gbXVsdGlwbGUgcGF5bWVudHMsIGJ1dCB3ZSBkb24ndCovXG4vKiBuZWVkIHRvIHBheSB0aGUgY29zdHMgb2YgcHJvdGVjdGluZyBhZ2FpbnN0IGFsaWFzaW5nIGZvciB0aGUqL1xuLyogb3RoZXIgdXNlcy4qL1xuXG5pZihwYXltZW50cy5sZW5ndGg+MSl7XG5jb25zdCBhbnRpQWxpYXNpbmdTdG9yZT1uZXcgU2V0KCk7XG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+e1xuIWFudGlBbGlhc2luZ1N0b3JlLmhhcyhwYXltZW50KXx8XG5hc3NlcnQuZmFpbChYIGBzYW1lIHBheW1lbnQgJHtwYXltZW50fSBzZWVuIHR3aWNlYCk7XG5hbnRpQWxpYXNpbmdTdG9yZS5hZGQocGF5bWVudCk7XG4gfSk7XG4gfVxuXG5jb25zdCB0b3RhbD1wYXltZW50cy5tYXAocGF5bWVudExlZGdlci5nZXQpLnJlZHVjZShhZGQsZW1wdHlBbW91bnQpO1xuXG5jb25zdCBuZXdUb3RhbD1uZXdQYXltZW50QmFsYW5jZXMucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbi8qIEludmFyaWFudCBjaGVjayovXG5pc0VxdWFsKHRvdGFsLG5ld1RvdGFsKXx8XG5hc3NlcnQuZmFpbChYIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke25ld1RvdGFsfWApO1xuXG5sZXQgbmV3UGF5bWVudHM7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQqL1xucGF5bWVudHMuZm9yRWFjaCgocGF5bWVudCk9PmRlbGV0ZVBheW1lbnQocGF5bWVudCkpO1xuXG5uZXdQYXltZW50cz1uZXdQYXltZW50QmFsYW5jZXMubWFwKChiYWxhbmNlKT0+e1xuY29uc3QgbmV3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQobmV3UGF5bWVudCxiYWxhbmNlLHVuZGVmaW5lZCk7XG5yZXR1cm4gbmV3UGF5bWVudDtcbiB9KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gaGFyZGVuKG5ld1BheW1lbnRzKTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgZGVwb3NpdFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZT11bmRlZmluZWQpPT5cbntcbmFzc2VydChcbiFpc1Byb21pc2Uoc3JjUGF5bWVudCksXG4gYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG5UeXBlRXJyb3IpO1xuXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9YWRkKHNyY1BheW1lbnRCYWxhbmNlLGN1cnJlbnRCYWxhbmNlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG4vKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbi8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbmFzc2VydC5mYWlsKFxuWCBgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7Y3VycmVudEJhbGFuY2V9YCk7XG5cbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1zdWJ0cmFjdChjdXJyZW50QmFsYW5jZSxhbW91bnQpO1xuXG5jb25zdCBwYXltZW50PW1ha2VQYXltZW50KCk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQgTW92ZSB0aGUgd2l0aGRyYXduIGFzc2V0cyBmcm9tIHRoaXMgcHVyc2UgaW50byovXG4vKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbmluaXRQYXltZW50KHBheW1lbnQsYW1vdW50LHJlY292ZXJ5U2V0KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudDtcbiB9O1xuXG5jb25zdCBtYWtlRW1wdHlQdXJzZT12aXZpZnlQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbmNvbnN0IGlzc3Vlcj12aXZpZnlGYXJJbnN0YW5jZShpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG5nZXRBbW91bnRPZihwYXltZW50KXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xucmV0dXJuIHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuIH0sXG5cbmJ1cm4ocGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5jb25zdCBwYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5ULiovXG5kZWxldGVQYXltZW50KHBheW1lbnQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50QmFsYW5jZTtcbiB9LFxuY2xhaW0oc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0W3BheW1lbnRdPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbc3JjUGF5bWVudEJhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0sXG5jb21iaW5lKGZyb21QYXltZW50c1BBcnJheSxvcHRUb3RhbEFtb3VudD11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkb2VzICpub3QqIGRlbGF5IGNhbGxpbmcgYGNvbWJpbmVgLCBidXQgcmF0aGVyIGxlYXZlcyBpdCovXG4vKiB0byBgY29tYmluZWAgdG8gZGVsYXkgZnVydGhlciBwcm9jZXNzaW5nIHVudGlsIGFsbCB0aGUgZWxlbWVudHMgb2YqL1xuLyogYGZyb21QYXltZW50c1BBcnJheWAgaGF2ZSBmdWxmaWxsZWQuKi9cblxuLyogUGF5bWVudHMgaW4gYGZyb21QYXltZW50c1BBcnJheWAgbXVzdCBiZSBkaXN0aW5jdC4gQWxpYXMqL1xuLyogY2hlY2tpbmcgaXMgZGVsZWdhdGVkIHRvIHRoZSBgbW92ZUFzc2V0c2AgZnVuY3Rpb24uKi9cbnJldHVybiBQcm9taXNlLmFsbChmcm9tUGF5bWVudHNQQXJyYXkpLnRoZW4oKGZyb21QYXltZW50c0FycmF5KT0+e1xuZnJvbVBheW1lbnRzQXJyYXkuZXZlcnkoYXNzZXJ0TGl2ZVBheW1lbnQpO1xuY29uc3QgdG90YWxQYXltZW50c0JhbGFuY2U9ZnJvbVBheW1lbnRzQXJyYXkuXG5tYXAocGF5bWVudExlZGdlci5nZXQpLlxucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHRvdGFsUGF5bWVudHNCYWxhbmNlLG9wdFRvdGFsQW1vdW50KTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdFtwYXltZW50XT1tb3ZlQXNzZXRzKFxuaGFyZGVuKGZyb21QYXltZW50c0FycmF5KSxcbmhhcmRlbihbdG90YWxQYXltZW50c0JhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0pO1xuIH0sXG5zcGxpdChzcmNQYXltZW50LHBheW1lbnRBbW91bnRBKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbnBheW1lbnRBbW91bnRBPWNvZXJjZShwYXltZW50QW1vdW50QSk7XG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuY29uc3QgcGF5bWVudEFtb3VudEI9c3VidHJhY3Qoc3JjUGF5bWVudEJhbGFuY2UscGF5bWVudEFtb3VudEEpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0IG5ld1BheW1lbnRzPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbcGF5bWVudEFtb3VudEEscGF5bWVudEFtb3VudEJdKSk7XG5cbnJldHVybiBuZXdQYXltZW50cztcbiB9LFxuc3BsaXRNYW55KHNyY1BheW1lbnQsYW1vdW50cyl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmFzc2VydENvcHlBcnJheShhbW91bnRzLCdhbW91bnRzJyk7XG5hbW91bnRzPWFtb3VudHMubWFwKGNvZXJjZSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3QgbmV3UGF5bWVudHM9bW92ZUFzc2V0cyhoYXJkZW4oW3NyY1BheW1lbnRdKSxoYXJkZW4oYW1vdW50cykpO1xucmV0dXJuIG5ld1BheW1lbnRzO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbmZpdChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbmluaXRQYXltZW50KHBheW1lbnQsbmV3QW1vdW50LHVuZGVmaW5lZCk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmR9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnZpdmlmeVBheW1lbnRMZWRnZXIodml2aWZ5UGF5bWVudExlZGdlcik7XG5oYXJkZW4odml2aWZ5UGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5UGF5bWVudExlZGdlciI6WyJ2aXZpZnlQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALlEVLjuDgAA7g4AACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdml2aWZ5RmFyQ2xhc3NLaXQsbWFrZVNjYWxhckJpZ1NldFN0b3JlLEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInZpdmlmeUZhckNsYXNzS2l0XCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJDbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgICAgICAgIHZpdmlmeVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD12aXZpZnlGYXJDbGFzc0tpdChcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gUHVyc2VgLFxuUHVyc2VJS2l0LFxuKCk9PntcbmNvbnN0IGN1cnJlbnRCYWxhbmNlPUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5cbi8qKiBAdHlwZSB7U2V0U3RvcmU8UGF5bWVudD59ICovXG5jb25zdCByZWNvdmVyeVNldD1tYWtlU2NhbGFyQmlnU2V0U3RvcmUoJ3JlY292ZXJ5IHNldCcse1xuZHVyYWJsZTp0cnVlfSk7XG5cblxucmV0dXJue1xuY3VycmVudEJhbGFuY2UsXG5yZWNvdmVyeVNldH07XG5cbiB9LFxue1xucHVyc2U6e1xuZGVwb3NpdChzcmNQYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogU2VlIHRoZSBjb21tZW50cyBvbiBQdXJzZUkuZGVwb3NpdCBpbiB0eXBlR3VhcmRzLmpzKi9cbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIGRlcG9zaXQuKi9cbnJldHVybiBkZXBvc2l0SW50ZXJuYWwoXG5zdGF0ZS5jdXJyZW50QmFsYW5jZSxcbihuZXdQdXJzZUJhbGFuY2UpPT5cbnVwZGF0ZVB1cnNlQmFsYW5jZShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UsdGhpcy5mYWNldHMucHVyc2UpLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlLFxuc3RhdGUucmVjb3ZlcnlTZXQpO1xuXG4gfSxcbndpdGhkcmF3KGFtb3VudCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiB3aXRoZHJhdy4qL1xucmV0dXJuIHdpdGhkcmF3SW50ZXJuYWwoXG5zdGF0ZS5jdXJyZW50QmFsYW5jZSxcbihuZXdQdXJzZUJhbGFuY2UpPT5cbnVwZGF0ZVB1cnNlQmFsYW5jZShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UsdGhpcy5mYWNldHMucHVyc2UpLFxuYW1vdW50LFxuc3RhdGUucmVjb3ZlcnlTZXQpO1xuXG4gfSxcbmdldEN1cnJlbnRBbW91bnQoKXtcbnJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnRCYWxhbmNlO1xuIH0sXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKXtcbnJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuIH0sXG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmdldERlcG9zaXRGYWNldCgpe1xucmV0dXJuIHRoaXMuZmFjZXRzLmRlcG9zaXRGYWNldDtcbiB9LFxuXG5nZXRSZWNvdmVyeVNldCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiB9LFxucmVjb3ZlckFsbCgpe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xubGV0IGFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuZm9yKGNvbnN0IHBheW1lbnQgb2Ygc3RhdGUucmVjb3ZlcnlTZXQua2V5cygpKXtcbi8qIFRoaXMgZG9lcyBjYXVzZSBkZWxldGlvbnMgZnJvbSB0aGUgc2V0IHdoaWxlIGl0ZXJhdGluZywqL1xuLyogYnV0IHRoaXMgc3BlY2lhbCBjYXNlIGlzIGFsbG93ZWQuKi9cbmNvbnN0IGRlbHRhPWZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuYW1vdW50PUFtb3VudE1hdGguYWRkKGFtb3VudCxkZWx0YSxicmFuZCk7XG4gfVxuc3RhdGUucmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpPT09MHx8XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YCk7XG5cbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UHVyc2VLaW5kKHZpdmlmeVB1cnNlS2luZCk7XG5oYXJkZW4odml2aWZ5UHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQdXJzZUtpbmQiOlsidml2aWZ5UHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN7bNaX7BQAA+wUAAC0AAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJvdmlkZUxhenksbWFrZU5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3QgICAgICAgIG1ha2VUcmFuc2llbnROb3RpZmllcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHM9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbid0cmFuc2llbnROb3RpZmVyS2l0cycpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcktpdD0oa2V5KT0+XG5wcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cyxrZXksKCk9PlxubWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXI9KGtleSk9PnByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuY29uc3QgdXBkYXRlPShrZXksbmV3VmFsdWUpPT57XG5pZih0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSl7XG5jb25zdHt1cGRhdGVyfT10cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbnVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuIH1cbiB9O1xuXG5yZXR1cm57cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2mTG2hiYAAIYmAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIEJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjigI1fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclNoYXBlPU0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaOKAjV9vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbmNvbnN0ICAgICAgICBQYXltZW50U2hhcGU9TS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaOKAjV9vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuY29uc3QgICAgICAgIFB1cnNlU2hhcGU9TS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjigI1fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuY29uc3QgICAgICAgIERlcG9zaXRGYWNldFNoYXBlPU0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaOKAjV9vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbmNvbnN0IE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7XG5jb25zdCAgICAgICAgTWludFNoYXBlPU0ucmVtb3RhYmxlKCdNaW50Jyk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIE5hdFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXNcbiAqIGEgbm9uLW5lZ2F0aXZlIGJpZ2ludCwgdGhlbiBpdCByZXByZXNlbnRzIHRoYXQgbWFueSB1bml0cyBvZiB0aGVcbiAqIGZ1bmdpYmxlIGFzc2V0IHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50LiBUaGUgYnJhbmQgb2YgdGhhdCBhbW91bnRcbiAqIHNob3VsZCBpbmRlZWQgcmVwcmVzZW50IGEga2luZCBvZiBhc3NldCBjb25zaXN0aW5nIG9mIGEgY291bnRhYmxlXG4gKiBzZXQgb2YgZnVuZ2libGUgdW5pdHMuXG4gKi8kaOKAjV9vbmNlLk1pbnRTaGFwZShNaW50U2hhcGUpO1xuY29uc3QgTmF0VmFsdWVTaGFwZT1NLm5hdCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5U2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5U2V0LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aG9zZVxuICoga2V5cywgd2hlcmUgZWFjaCBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgbm9uLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIG5vbi1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIHNldCBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZT1NLnNldCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlBcnJheSBvZiBwYXNzYWJsZSBLZXlzLiBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGRlcHJlY2F0ZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiBDb3B5U2V0VmFsdWVzLlxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weUJhZ1ZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUJhZywgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBiYWcgKG11bHRpc2V0KSBvZiB0aG9zZVxuICoga2V5cywgd2hlcmUgZWFjaCBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgc2VtaS1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBzZW1pLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQga2V5XG4gKiBhcHBlYXJzIGluIHRoZSBiYWcgaXMgdGhlIG51bWJlciBvZiBmdW5naWJsZSB1bml0cyBvZiB0aGF0IGtleS5cbiAqIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weUJhZ1ZhbHVlU2hhcGU9TS5iYWcoKTtcblxuY29uc3QgQW1vdW50VmFsdWVTaGFwZT1NLm9yKFxuTmF0VmFsdWVTaGFwZSxcbkNvcHlTZXRWYWx1ZVNoYXBlLFxuU2V0VmFsdWVTaGFwZSxcbkNvcHlCYWdWYWx1ZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgQW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kOkJyYW5kU2hhcGUsXG52YWx1ZTpBbW91bnRWYWx1ZVNoYXBlfSk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBOYXQgYmlnaW50LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgWGltcG9ydCgnLi90eXBlcy5qcycpLk5hdFZhbHVlfVxuICovJGjigI1fb25jZS5BbW91bnRTaGFwZShBbW91bnRTaGFwZSk7XG5jb25zdCAgICAgICAgaXNOYXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLE5hdFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnVmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWdWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlCYWdWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weUJhZ1ZhbHVlKGlzQ29weUJhZ1ZhbHVlKTtcbmhhcmRlbihpc0NvcHlCYWdWYWx1ZSk7XG5cbi8qIE9uZSBHT09HT0x0aCBzaG91bGQgYmUgZW5vdWdoIGRlY2ltYWwgcGxhY2VzIGZvciBhbnlib2R5LiovXG5jb25zdCAgICAgICAgTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTPTEwMDskaOKAjV9vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG5jb25zdCAgICAgICAgQXNzZXRLaW5kU2hhcGU9TS5vcignbmF0Jywnc2V0JywnY29weVNldCcsJ2NvcHlCYWcnKTskaOKAjV9vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuY29uc3QgICAgICAgIERpc3BsYXlJbmZvU2hhcGU9TS5zcGxpdFJlY29yZChcbnt9LFxue1xuZGVjaW1hbFBsYWNlczpNLmFuZChcbk0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSksXG5cbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntcbi8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbi8qIHByb3BlcnRpZXMgYmV5b25kIHRob3NlIGluIHRoZSBgYmFzZWAgcmVjb3JkLiovfSk7XG5cblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRJPU0uaW50ZXJmYWNlKCdCcmFuZCcse1xuaXNNeUlzc3VlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuZ2V0QW1vdW50U2hhcGU6TS5jYWxsKCkucmV0dXJucyhNLnBhdHRlcm4oKSl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjigI1fb25jZS5CcmFuZEkoQnJhbmRJKTtcbmNvbnN0ICAgICAgICBtYWtlSXNzdWVySW50ZXJmYWNlcz0oXG5icmFuZFNoYXBlPUJyYW5kU2hhcGUsXG5hc3NldEtpbmRTaGFwZT1Bc3NldEtpbmRTaGFwZSxcbmFtb3VudFNoYXBlPUFtb3VudFNoYXBlKT0+XG57XG5jb25zdCBJc3N1ZXJJPU0uaW50ZXJmYWNlKCdJc3N1ZXInLHtcbmdldEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0QXNzZXRLaW5kOk0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbm1ha2VFbXB0eVB1cnNlOk0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbmlzTGl2ZTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbW91bnRPZjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5idXJuOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoYW1vdW50U2hhcGUpLFxuY2xhaW06TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhQYXltZW50U2hhcGUpLFxuY29tYmluZTpNLmNhbGwoTS5hcnJheU9mKE0uZXJlZihQYXltZW50U2hhcGUpKSkuXG5vcHRpb25hbChhbW91bnRTaGFwZSkuXG5yZXR1cm5zKE0uZXJlZihQYXltZW50U2hhcGUpKSxcbnNwbGl0Ok0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpLGFtb3VudFNoYXBlKS5yZXR1cm5zKFxuTS5hcnJheU9mKFBheW1lbnRTaGFwZSkpLFxuXG5zcGxpdE1hbnk6TS5jYWxsV2hlbihcbk0uYXdhaXQoUGF5bWVudFNoYXBlKSxcbk0uYXJyYXlPZihhbW91bnRTaGFwZSkpLlxucmV0dXJucyhNLmFycmF5T2YoUGF5bWVudFNoYXBlKSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAArg3H76UIAAOlCAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldFZhbHVlIHwgQ29weUJhZ1ZhbHVlfSBBbW91bnRWYWx1ZVxuICogQW4gYEFtb3VudFZhbHVlYCBkZXNjcmliZXMgYSBzZXQgb3IgcXVhbnRpdHkgb2YgYXNzZXRzIHRoYXQgY2FuIGJlIG93bmVkIG9yXG4gKiBzaGFyZWQuXG4gKlxuICogQSBmdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYSBub24tbmVnYXRpdmUgYmlnaW50IHRvIHJlcHJlc2VudCBhIHF1YW50aXR5XG4gKiBvZiB0aGF0IG1hbnkgYXNzZXRzLlxuICpcbiAqIEEgbm9uLWZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhbiBhcnJheSBvciBDb3B5U2V0IG9mIGBLZXlgcyB0byByZXByZXNlbnRcbiAqIGEgc2V0IG9mIHdoYXRldmVyIGFzc2V0IGVhY2gga2V5IHJlcHJlc2VudHMuIEEgYEtleWAgaXMgYSBwYXNzYWJsZSB2YWx1ZVxuICogdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBlbGVtZW50IGluIGEgc2V0IChTZXRTdG9yZSBvciBDb3B5U2V0KSBvciBhcyB0aGVcbiAqIGtleSBpbiBhIG1hcCAoTWFwU3RvcmUgb3IgQ29weU1hcCkuXG4gKlxuICogYFNldFZhbHVlYCBpcyBmb3IgdGhlIGRlcHJlY2F0ZWQgc2V0IHJlcHJlc2VudGF0aW9uLCB1c2luZyBhbiBhcnJheSBkaXJlY3RseVxuICogdG8gcmVwcmVzZW50IHRoZSBhcnJheSBvZiBpdHMgZWxlbWVudHMuIGBDb3B5U2V0VmFsdWVgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdWYWx1ZWAgaXMgcmVwcmVzZW50ZWQgYXMgYVxuICogYENvcHlCYWdgIG9mIGBLZXlgIG9iamVjdHMuIFwiQmFnXCIgaXMgc3lub255bW91cyB3aXRoIE11bHRpU2V0LCB3aGVyZSBhblxuICogZWxlbWVudCBvZiBhIGJhZyBjYW4gYmUgcHJlc2VudCBvbmNlIG9yIG1vcmUgdGltZXMsIGkuZS4sIHNvbWUgcG9zaXRpdmVcbiAqIGJpZ2ludCBudW1iZXIgb2YgdGltZXMsIHJlcHJlc2VudGluZyB0aGF0IHF1YW50aXR5IG9mIHRoZSBhc3NldCByZXByZXNlbnRlZFxuICogYnkgdGhhdCBrZXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJyB9IEFzc2V0S2luZFxuICpcbiAqIFNlZSBkb2MtY29tbWVudCBmb3IgYEFtb3VudFZhbHVlYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7SyBleHRlbmRzICduYXQnID8gTmF0VmFsdWUgOlxuICogSyBleHRlbmRzICdzZXQnID8gU2V0VmFsdWUgOlxuICogSyBleHRlbmRzICdjb3B5U2V0JyA/IENvcHlTZXRWYWx1ZTpcbiAqIEsgZXh0ZW5kcyAnY29weUJhZycgPyBDb3B5QmFnVmFsdWUgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0VmFsdWUgPyAnY29weVNldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5QmFnVmFsdWUgPyAnY29weUJhZycgOlxuICogIG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcj19IGRlY2ltYWxQbGFjZXMgVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kIC0gdGhlIGtpbmQgb2YgYXNzZXQsIGVpdGhlclxuICogICBBc3NldEtpbmQuTkFUIChmdW5naWJsZSkgb3JcbiAqICAgQXNzZXRLaW5kLlNFVCBvciBBc3NldEtpbmQuQ09QWV9TRVQgKG5vbi1mdW5naWJsZSlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcmFuZFxuICogVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZVxuICogYWxsZWdlZCBuYW1lIGZvciB0aGUga2luZCBvZiBhc3NldCBkZXNjcmliZWQuIFRoZSBhbGxlZ2VkIG5hbWUgKHN1Y2hcbiAqIGFzICdCVEMnIG9yICdtb29sYScpIGlzIHByb3ZpZGVkIGJ5IHRoZSBtYWtlciBvZiB0aGUgaXNzdWVyIGFuZCBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqIEV2ZXJ5IGFtb3VudCBjcmVhdGVkIGJ5IGEgcGFydGljdWxhciBBbW91bnRNYXRoIHdpbGwgc2hhcmUgdGhlIHNhbWUgYnJhbmQsXG4gKiBidXQgcmVjaXBpZW50cyBjYW5ub3QgcmVseSBvbiB0aGUgYnJhbmQgdG8gdmVyaWZ5IHRoYXQgYSBwdXJwb3J0ZWQgYW1vdW50XG4gKiByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogYSBtaXNiZWhhdmluZyBpc3N1ZXIuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZElzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPGJvb2xlYW4+fSBpc015SXNzdWVyXG4gKiBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mb1xuICogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBQYXR0ZXJufSBnZXRBbW91bnRTaGFwZVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJc3N1ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVySXNMaXZlXG4gKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2ZcbiAqXG4gKiBHZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC4gQmVjYXVzZSB0aGVcbiAqIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LCBhbmRcbiAqIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckJ1cm5cbiAqXG4gKiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50LiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXMgcHJlc2VudCwgdGhlXG4gKiBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudD59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNsYWltXG4gKlxuICogVHJhbnNmZXIgYWxsIGRpZ2l0YWwgYXNzZXRzIGZyb20gdGhlIHBheW1lbnQgdG8gYSBuZXcgcGF5bWVudCBhbmRcbiAqIGRlbGV0ZSB0aGUgb3JpZ2luYWwuIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpc1xuICogcHJlc2VudCwgdGhlIGNvZGUgd2lsbCBpbnNpc3QgdGhhdCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluXG4gKiB0aGUgcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ29tYmluZVxuICpcbiAqIENvbWJpbmUgbXVsdGlwbGUgcGF5bWVudHMgaW50byBvbmUgcGF5bWVudC5cbiAqXG4gKiBJZiBhbnkgb2YgdGhlIHBheW1lbnRzIGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWRcbiAqIHVwb24gcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj5bXX0gcGF5bWVudHNBcnJheVxuICogQHBhcmFtIHtBbW91bnQ8Sz49fSBvcHRUb3RhbEFtb3VudFxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlclNwbGl0XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIHR3byBwYXltZW50cyxcbiAqIEEgYW5kIEIsIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnlcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gbWFueSBwYXltZW50cywgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnRzXG4gKiBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyXG4gKlxuICogVGhlIGlzc3VlciBjYW5ub3QgbWludCBhIG5ldyBhbW91bnQsIGJ1dCBpdCBjYW4gY3JlYXRlIGVtcHR5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGUgaXNzdWVyIGNhbiBhbHNvIHRyYW5zZm9ybSBwYXltZW50cyAoc3BsaXR0aW5nXG4gKiBwYXltZW50cywgY29tYmluaW5nIHBheW1lbnRzLCBidXJuaW5nIHBheW1lbnRzLCBhbmQgY2xhaW1pbmdcbiAqIHBheW1lbnRzIGV4Y2x1c2l2ZWx5KS4gVGhlIGlzc3VlciBzaG91bGQgYmUgZ290dGVuIGZyb20gYSB0cnVzdGVkXG4gKiBzb3VyY2UgYW5kIHRoZW4gcmVsaWVkIHVwb24gYXMgdGhlIGRlY2lkZXIgb2Ygd2hldGhlciBhbiB1bnRydXN0ZWRcbiAqIHBheW1lbnQgaXMgdmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmQgR2V0IHRoZSBCcmFuZCBmb3IgdGhpcyBJc3N1ZXIuIFRoZVxuICogQnJhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgYW5kIGlzIHNoYXJlZCBieSB0aGVcbiAqIG1pbnQsIHRoZSBpc3N1ZXIsIGFuZCBhbnkgcHVyc2VzIGFuZCBwYXltZW50cyBvZiB0aGlzIHBhcnRpY3VsYXJcbiAqIGtpbmQuIFRoZSBicmFuZCBpcyBub3QgY2xvc2VseSBoZWxkLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmVcbiAqIHRydXN0ZWQgdG8gaWRlbnRpZnkgYW4gaXNzdWVyIGFsb25lLiBGYWtlIGRpZ2l0YWwgYXNzZXRzIGFuZCBhbW91bnRcbiAqIGNhbiB1c2UgYW5vdGhlciBpc3N1ZXIncyBicmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWUgR2V0IHRoZSBhbGxlZ2VkTmFtZSBmb3JcbiAqIHRoaXMgbWludC9pc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXNzZXRLaW5kfSBnZXRBc3NldEtpbmQgR2V0IHRoZSBraW5kIG9mXG4gKiBNYXRoSGVscGVycyB1c2VkIGJ5IHRoaXMgSXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mb30gZ2V0RGlzcGxheUluZm8gR2l2ZSBpbmZvcm1hdGlvbiB0byBVSVxuICogIG9uIGhvdyB0byBkaXNwbGF5IGFtb3VudHMgZm9yIHRoaXMgaXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBQdXJzZTxLPn0gbWFrZUVtcHR5UHVyc2UgTWFrZSBhbiBlbXB0eSBwdXJzZSBvZiB0aGlzXG4gKiBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVySXNMaXZlfSBpc0xpdmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyR2V0QW1vdW50T2Y8Sz59IGdldEFtb3VudE9mXG4gKiBAcHJvcGVydHkge0lzc3VlckJ1cm59IGJ1cm5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQ2xhaW08Sz59IGNsYWltXG4gKiBAcHJvcGVydHkge0lzc3VlckNvbWJpbmU8Sz59IGNvbWJpbmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyU3BsaXQ8Sz59IHNwbGl0XG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0TWFueX0gc3BsaXRNYW55XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudExlZGdlclxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlcktpdFxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZGl0aW9uYWxEaXNwbGF5SW5mb1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyPX0gZGVjaW1hbFBsYWNlcyBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtBc3NldEtpbmQ9fSBhc3NldEtpbmRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBDYWxsZWQgdG8gc2h1dCBzb21ldGhpbmcgZG93biBiZWNhdXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLCB3aGVyZSB0aGUgcmVhc29uXG4gKiBpcyBzdXBwb3NlZCB0byBiZSBhbiBFcnJvciB0aGF0IGRlc2NyaWJlcyB3aGF0IHdlbnQgd3JvbmcuIFNvbWUgdmFsaWRcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgU2h1dGRvd25XaXRoRmFpbHVyZWAgd2lsbCBuZXZlciByZXR1cm4sIGVpdGhlclxuICogYmVjYXVzZSB0aGV5IHRocm93IG9yIGJlY2F1c2UgdGhleSBpbW1lZGlhdGVseSBzaHV0ZG93biB0aGUgZW5jbG9zaW5nIHVuaXRcbiAqIG9mIGNvbXB1dGF0aW9uLiBIb3dldmVyLCB0aGV5IGFsc28gbWlnaHQgcmV0dXJuLCBzbyB0aGUgY2FsbGVyIHNob3VsZFxuICogZm9sbG93IHRoaXMgY2FsbCBieSB0aGVpciBvd24gZGVmZW5zaXZlIGB0aHJvdyByZWFzb247YCBpZiBhcHByb3ByaWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1pbnRcbiAqIEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsIGFzc2V0cy4gVGhlc2VcbiAqIGFzc2V0cyBhbGwgaGF2ZSB0aGUgc2FtZSBraW5kLCB3aGljaCBpcyBjYWxsZWQgYSBCcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyIEdldHMgdGhlIElzc3VlciBmb3IgdGhpcyBtaW50LlxuICogQHByb3BlcnR5IHsobmV3QW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IG1pbnRQYXltZW50XG4gKiBDcmVhdGVzIGEgbmV3IFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZXBvc2l0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7RGVwb3NpdEZhY2V0UmVjZWl2ZX0gcmVjZWl2ZVxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGUgcHVyc2UgdGhhdCBtYWRlIHRoaXMgZmFjZXQsXG4gKiByZXR1cm5pbmcgdGhlIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIFB1cnNlRGVwb3NpdFxuICogQHBhcmFtIHtQYXltZW50PEs+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdXJzZVxuICogUHVyc2VzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kLCBidXQgdW5saWtlIFBheW1lbnRzLFxuICogdGhleSBhcmUgbm90IG1lYW50IHRvIGJlIHNlbnQgdG8gb3RoZXJzLiBUbyB0cmFuc2ZlciBkaWdpdGFsIGFzc2V0cywgYVxuICogUGF5bWVudCBzaG91bGQgYmUgd2l0aGRyYXduIGZyb20gYSBQdXJzZS4gVGhlIGFtb3VudCBvZiBkaWdpdGFsXG4gKiBhc3NldHMgaW4gYSBwdXJzZSBjYW4gY2hhbmdlIHRocm91Z2ggdGhlIGFjdGlvbiBvZiBkZXBvc2l0KCkgYW5kIHdpdGhkcmF3KCkuXG4gKlxuICogVGhlIHByaW1hcnkgdXNlIGZvciBQdXJzZXMgYW5kIFBheW1lbnRzIGlzIGZvciBjdXJyZW5jeS1saWtlIGFuZCBnb29kcy1saWtlXG4gKiBkaWdpdGFsIGFzc2V0cywgYnV0IHRoZXkgY2FuIGFsc28gYmUgdXNlZCB0byByZXByZXNlbnQgb3RoZXIga2luZHMgb2YgcmlnaHRzLFxuICogc3VjaCBhcyB0aGUgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGNvbnRyYWN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZCBHZXQgdGhlIGFsbGVnZWQgQnJhbmQgZm9yIHRoaXMgUHVyc2VcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gZ2V0Q3VycmVudEFtb3VudFxuICogR2V0IHRoZSBhbW91bnQgY29udGFpbmVkIGluIHRoaXMgcHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBOb3RpZmllcjxBbW91bnQ8Sz4+fSBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXJcbiAqIEdldCBhIGxvc3N5IG5vdGlmaWVyIGZvciBjaGFuZ2VzIHRvIHRoaXMgcHVyc2UncyBiYWxhbmNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7UHVyc2VEZXBvc2l0PEs+fSBkZXBvc2l0XG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoaXMgcHVyc2UsIHJldHVybmluZyB0aGVcbiAqIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBEZXBvc2l0RmFjZXR9IGdldERlcG9zaXRGYWNldFxuICogUmV0dXJuIGFuIG9iamVjdCB3aG9zZSBgcmVjZWl2ZWAgbWV0aG9kIGRlcG9zaXRzIHRvIHRoZSBjdXJyZW50IFB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSB3aXRoZHJhd1xuICogV2l0aGRyYXcgYW1vdW50IGZyb20gdGhpcyBwdXJzZSBpbnRvIGEgbmV3IFBheW1lbnQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBDb3B5U2V0PFBheW1lbnQ8Sz4+fSBnZXRSZWNvdmVyeVNldFxuICogVGhlIHNldCBvZiBwYXltZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwdXJzZSB0aGF0IGFyZSBzdGlsbCBsaXZlLiBUaGVzZVxuICogYXJlIHRoZSBwYXltZW50cyB0aGF0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gZW1lcmdlbmNpZXMgYnksIGZvciBleGFtcGxlLFxuICogZGVwb3NpdGluZyBpbnRvIHRoaXMgcHVyc2UuIFN1Y2ggYSBkZXBvc2l0IGFjdGlvbiBpcyBsaWtlIGNhbmNlbGluZyBhblxuICogb3V0c3RhbmRpbmcgY2hlY2sgYmVjYXVzZSB5b3UncmUgdGlyZWQgb2Ygd2FpdGluZyBmb3IgaXQuIE9uY2UgeW91clxuICogY2FuY2VsbGF0aW9uIGlzIGFja25vd2xlZGdlZCwgeW91IGNhbiBzcGVuZCB0aGUgYXNzZXRzIGF0IHN0YWtlIG9uIG90aGVyXG4gKiB0aGluZ3MuIEFmdGVyd2FyZHMsIGlmIHRoZSByZWNpcGllbnQgb2YgdGhlIG9yaWdpbmFsIGNoZWNrIGZpbmFsbHkgZ2V0c1xuICogYXJvdW5kIHRvIGRlcG9zaXRpbmcgaXQsIHRoZWlyIGRlcG9zaXQgZmFpbHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IHJlY292ZXJBbGxcbiAqIEZvciB1c2UgaW4gZW1lcmdlbmNpZXMsIHN1Y2ggYXMgY29taW5nIGJhY2sgZnJvbSBhIHRyYXVtYXRpYyBjcmFzaCBhbmRcbiAqIHVwZ3JhZGUuIFRoaXMgZGVwb3NpdHMgYWxsIHRoZSBwYXltZW50cyBpbiB0aGlzIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0XG4gKiBpbnRvIHRoZSBwdXJzZSBpdHNlbGYsIHJldHVybmluZyB0aGUgdG90YWwgYW1vdW50IG9mIGFzc2V0cyByZWNvdmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudFxuICogUGF5bWVudHMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQgaW4gdHJhbnNpdC4gUGF5bWVudHNcbiAqIGNhbiBiZSBkZXBvc2l0ZWQgaW4gcHVyc2VzLCBzcGxpdCBpbnRvIG11bHRpcGxlIHBheW1lbnRzLCBjb21iaW5lZCwgYW5kXG4gKiBjbGFpbWVkIChnZXR0aW5nIGFuIGV4Y2x1c2l2ZSBwYXltZW50KS4gUGF5bWVudHMgYXJlIGxpbmVhciwgbWVhbmluZ1xuICogdGhhdCBlaXRoZXIgYSBwYXltZW50IGhhcyB0aGUgc2FtZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaXRcbiAqIHN0YXJ0ZWQgd2l0aCwgb3IgaXQgaXMgdXNlZCB1cCBlbnRpcmVseS4gSXQgaXMgaW1wb3NzaWJsZSB0byBwYXJ0aWFsbHkgdXNlIGFcbiAqIHBheW1lbnQuXG4gKlxuICogUGF5bWVudHMgYXJlIG9mdGVuIHJlY2VpdmVkIGZyb20gb3RoZXIgYWN0b3JzIGFuZCB0aGVyZWZvcmUgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCB0aGVtc2VsdmVzLiBUbyBnZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiBhIHBheW1lbnQsXG4gKiB1c2UgdGhlIHRydXN0ZWQgaXNzdWVyOiBpc3N1ZXIuZ2V0QW1vdW50T2YocGF5bWVudCksXG4gKlxuICogUGF5bWVudHMgY2FuIGJlIGNvbnZlcnRlZCB0byBQdXJzZXMgYnkgZ2V0dGluZyBhIHRydXN0ZWQgaXNzdWVyIGFuZFxuICogY2FsbGluZyBgaXNzdWVyLm1ha2VFbXB0eVB1cnNlKClgIHRvIGNyZWF0ZSBhIHB1cnNlLCB0aGVuXG4gKiBgcHVyc2UuZGVwb3NpdChwYXltZW50KWAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kXG4gKiBHZXQgdGhlIGFsbGVnZWRCcmFuZCwgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IHRoaXNcbiAqIHBheW1lbnQgcHVycG9ydHMgdG8gYmUsIGFuZCB3aGljaCBpc3N1ZXIgdG8gdXNlLiBCZWNhdXNlIHBheW1lbnRzXG4gKiBhcmUgbm90IHRydXN0ZWQsIGFueSBtZXRob2QgY2FsbHMgb24gcGF5bWVudHMgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIHdpdGggc3VzcGljaW9uIGFuZCB2ZXJpZmllZCBlbHNld2hlcmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRoSGVscGVyc1xuICogQWxsIG9mIHRoZSBkaWZmZXJlbmNlIGluIGhvdyBkaWdpdGFsIGFzc2V0IGFtb3VudCBhcmUgbWFuaXB1bGF0ZWQgY2FuIGJlXG4gKiByZWR1Y2VkIHRvIHRoZSBiZWhhdmlvciBvZiB0aGUgbWF0aCBvbiB2YWx1ZXMuIFdlIGV4dHJhY3QgdGhpc1xuICogY3VzdG9tIGxvZ2ljIGludG8gbWF0aEhlbHBlcnMuIE1hdGhIZWxwZXJzIGFyZSBhYm91dCB2YWx1ZVxuICogYXJpdGhtZXRpYywgd2hlcmVhcyBBbW91bnRNYXRoIGlzIGFib3V0IGFtb3VudHMsIHdoaWNoIGFyZSB0aGVcbiAqIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCB1c2UgbWF0aEhlbHBlcnMgdG8gZG8gdGhlaXIgdmFsdWVcbiAqIGFyaXRobWV0aWMsIGFuZCB0aGVuIGJyYW5kIHRoZSByZXN1bHRzLCBtYWtpbmcgYSBuZXcgYW1vdW50LlxuICpcbiAqIFRoZSBNYXRoSGVscGVycyBhcmUgZGVzaWduZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSBBbW91bnRNYXRoLCBhbmQgc29cbiAqIGFsbCBtZXRob2RzIGJ1dCBjb2VyY2UgY2FuIGFzc3VtZSB0aGVpciBpbnB1dHMgYXJlIHZhbGlkLiBUaGV5IG9ubHlcbiAqIG5lZWQgdG8gZG8gb3V0cHV0IHZhbGlkYXRpb24sIGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZlxuICogaW52YWxpZCBvdXRwdXQuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFZhbHVlOiBWKSA9PiBWfSBkb0NvZXJjZVxuICogQ2hlY2sgdGhlIGtpbmQgb2YgdGhpcyB2YWx1ZSBhbmQgdGhyb3cgaWYgaXQgaXMgbm90IHRoZVxuICogZXhwZWN0ZWQga2luZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFZ9IGRvTWFrZUVtcHR5XG4gKiBHZXQgdGhlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgaWRlbnRpdHkgZWxlbWVudCAob2Z0ZW4gMCBvciBhblxuICogZW1wdHkgYXJyYXkpXG4gKlxuICogQHByb3BlcnR5IHsodmFsdWU6IFYpID0+IGJvb2xlYW59IGRvSXNFbXB0eVxuICogSXMgdGhlIHZhbHVlIHRoZSBpZGVudGl0eSBlbGVtZW50P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzR1RFXG4gKiBJcyB0aGUgbGVmdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzRXF1YWxcbiAqIERvZXMgbGVmdCBlcXVhbCByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9BZGRcbiAqIFJldHVybiB0aGUgbGVmdCBjb21iaW5lZCB3aXRoIHRoZSByaWdodC5cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9TdWJ0cmFjdFxuICogUmV0dXJuIHdoYXQgcmVtYWlucyBhZnRlciByZW1vdmluZyB0aGUgcmlnaHQgZnJvbSB0aGUgbGVmdC4gSWZcbiAqIHNvbWV0aGluZyBpbiB0aGUgcmlnaHQgd2FzIG5vdCBpbiB0aGUgbGVmdCwgd2UgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YmlnaW50fSBOYXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPE5hdFZhbHVlPn0gTmF0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPFNldFZhbHVlPn0gU2V0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5U2V0PEtleT59IENvcHlTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPENvcHlTZXRWYWx1ZT59IENvcHlTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlCYWc8S2V5Pn0gQ29weUJhZ1ZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weUJhZ1ZhbHVlPn0gQ29weUJhZ01hdGhIZWxwZXJzXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApY/07oUEAACFBAAAMAAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvbWFrZVRyYWNlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG5jb25zdCBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7YWNthA0AAIQNAABDAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92YXVsdEZhY3RvcnkvbGlxdWlkYXRlTWluaW11bS5qc3siaW1wb3J0cyI6WyIuLi9tYWtlVHJhY2VyLmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxjZWlsTXVsdGlwbHlCeSxvZmZlclRvLEFtb3VudE1hdGgsRmFyLG1ha2VUcmFjZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJjZWlsTXVsdGlwbHlCeVwiLCBbJGjigI1fYSA9PiAoY2VpbE11bHRpcGx5QnkgPSAkaOKAjV9hKV1dLFtcIm9mZmVyVG9cIiwgWyRo4oCNX2EgPT4gKG9mZmVyVG8gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4uL21ha2VUcmFjZXIuanNcIiwgW1tcIm1ha2VUcmFjZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VUcmFjZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHRyYWNlPW1ha2VUcmFjZXIoJ0xpcU1pbicsZmFsc2UpO1xuXG4vKipcbiAqIFRoaXMgY29udHJhY3QgbGlxdWlkYXRlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgdmF1bHQncyBjb2xsYXRlcmFsIG5lY2Vzc2FyeVxuICogdG8gc2F0aXNmeSB0aGUgZGVidC4gSXQgdXNlcyB0aGUgQU1NJ3Mgc3dhcE91dCwgd2hpY2ggc2VsbHMgbm8gbW9yZSB0aGFuXG4gKiBuZWNlc3NhcnkuIEJlY2F1c2UgaXQgaGFzIG9mZmVyIHNhZmV0eSwgaXQgY2FuIHJlZnVzZSB0aGUgdHJhZGUuIFdoZW4gdGhhdFxuICogaGFwcGVucywgd2UgZmFsbCBiYWNrIHRvIHNlbGxpbmcgdXNpbmcgdGhlIGRlZmF1bHQgc3RyYXRlZ3ksIHdoaWNoIGN1cnJlbnRseVxuICogdXNlcyB0aGUgQU1NJ3Mgc3dhcEluIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtaQ0Y8e1xuICogICBhbW06IFhZS0FNTVB1YmxpY0ZhY2V0LFxuICogfT59IHpjZlxuICovXG5jb25zdCBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdHthbW19PXpjZi5nZXRUZXJtcygpO1xudHJhY2UoJ3N0YXJ0Jyx6Y2YuZ2V0VGVybXMoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBkZWJ0b3JTZWF0XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBvcHRpb25zLmRlYnQgRGVidCBiZWZvcmUgcGVuYWx0aWVzXG4gKiBAcGFyYW0ge1JhdGlvfSBvcHRpb25zLnBlbmFsdHlSYXRlXG4gKi9cbmNvbnN0IGhhbmRsZUxpcXVpZGF0aW9uT2ZmZXI9YXN5bmMoXG5kZWJ0b3JTZWF0LFxue2RlYnQ6b3JpZ2luYWxEZWJ0LHBlbmFsdHlSYXRlfSk9Plxue1xuLyogWFhYIGRvZXMgbm90IGRpc3RyaWJ1dGUgcGVuYWx0aWVzIGFueXdoZXJlKi9cbmNvbnN0e3pjZlNlYXQ6cGVuYWx0eVBvb2xTZWF0fT16Y2YubWFrZUVtcHR5U2VhdEtpdCgpO1xuY29uc3QgcGVuYWx0eT1jZWlsTXVsdGlwbHlCeShvcmlnaW5hbERlYnQscGVuYWx0eVJhdGUpO1xuY29uc3QgZGVidFdpdGhQZW5hbHR5PUFtb3VudE1hdGguYWRkKG9yaWdpbmFsRGVidCxwZW5hbHR5KTtcbmNvbnN0IGRlYnRCcmFuZD1vcmlnaW5hbERlYnQuYnJhbmQ7XG5jb25zdHtcbmdpdmU6e0luOmFtb3VudElufX09XG5kZWJ0b3JTZWF0LmdldFByb3Bvc2FsKCk7XG5cbmNvbnN0IHN3YXBJbnZpdGF0aW9uPUUoYW1tKS5tYWtlU3dhcEludml0YXRpb24oKTtcbmNvbnN0IGxpcVByb3Bvc2FsPWhhcmRlbih7XG5naXZlOntJbjphbW91bnRJbn0sXG53YW50OntPdXQ6QW1vdW50TWF0aC5tYWtlRW1wdHkoZGVidEJyYW5kKX19KTtcblxudHJhY2UoIGBPRkZFUiBUTyBERUJUOiBgLGRlYnRXaXRoUGVuYWx0eSxhbW91bnRJbik7XG5jb25zdHtkZXBvc2l0ZWR9PWF3YWl0IG9mZmVyVG8oXG56Y2YsXG5zd2FwSW52aXRhdGlvbixcbnVuZGVmaW5lZCwvKiBUaGUga2V5d29yZHMgd2VyZSBtYXBwZWQgYWxyZWFkeSovXG5saXFQcm9wb3NhbCxcbmRlYnRvclNlYXQsXG5kZWJ0b3JTZWF0LFxue3N0b3BBZnRlcjpkZWJ0V2l0aFBlbmFsdHl9KTtcblxuY29uc3QgYW1vdW50cz1hd2FpdCBkZXBvc2l0ZWQ7XG50cmFjZSggYExpcSByZXN1bHRzYCx7XG5kZWJ0V2l0aFBlbmFsdHksXG5hbW91bnRJbixcbnBhaWQ6ZGVidG9yU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpLFxuYW1vdW50c30pO1xuXG5cbi8qIE5vdyB3ZSBuZWVkIHRvIGtub3cgaG93IG11Y2ggd2FzIHNvbGQgc28gd2UgY2FuIHBheSBvZmYgdGhlIGRlYnQuKi9cbi8qIFdlIGNhbiB1c2UgdGhpcyBzZWF0IGJlY2F1c2Ugb25seSBsaXF1aWRhdGlvbiBhZGRzIGRlYnQgYnJhbmQgdG8gaXQuLiovXG5jb25zdCBkZWJ0UGFpZD1kZWJ0b3JTZWF0LmdldEFtb3VudEFsbG9jYXRlZCgnT3V0JyxkZWJ0QnJhbmQpO1xuY29uc3QgcGVuYWx0eVBhaWQ9QW1vdW50TWF0aC5taW4ocGVuYWx0eSxkZWJ0UGFpZCk7XG5cbi8qIEFsbG9jYXRlIHBlbmFsdHkgcG9ydGlvbiBvZiBwcm9jZWVkcyB0byBhIHNlYXQgdGhhdCB3aWxsIGhvbGQgaXQgZm9yIHRyYW5zZmVyIHRvIHJlc2VydmUqL1xucGVuYWx0eVBvb2xTZWF0LmluY3JlbWVudEJ5KFxuZGVidG9yU2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oe091dDpwZW5hbHR5UGFpZH0pKSk7XG5cbnpjZi5yZWFsbG9jYXRlKHBlbmFsdHlQb29sU2VhdCxkZWJ0b3JTZWF0KTtcblxuZGVidG9yU2VhdC5leGl0KCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7RVJlZjxMaXF1aWRhdG9yPn1cbiAqL1xuY29uc3QgY3JlYXRvckZhY2V0PUZhcignZGVidG9ySW52aXRhdGlvbkNyZWF0b3IgKG1pbmltdW0pJyx7XG5tYWtlTGlxdWlkYXRlSW52aXRhdGlvbjooKT0+XG56Y2YubWFrZUludml0YXRpb24oaGFuZGxlTGlxdWlkYXRpb25PZmZlciwnTGlxdWlkYXRlJyl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtjcmVhdG9yRmFjZXR9KTtcbiB9O1xuXG4vKiogQHR5cGVkZWYge0NvbnRyYWN0T2Y8dHlwZW9mIHN0YXJ0Pn0gTGlxdWlkYXRpb25Db250cmFjdCAqLyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xuXG5oYXJkZW4oc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADTZ0itoBAAAaAQAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvY29uZmlnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIldhbGxldE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiogQGZpbGVcbiAqXG4gKiBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCBhbmQgb3VyIGxheCBwYWNrYWdlXG4gKiBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb24gZXJyb3JzLlxuICpcbiAqIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKi9cbmNvbnN0ICAgICAgICBCcmlkZ2VJZD17XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcblBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6J3Byb3Zpc2lvbldhbGxldCcsXG5XQUxMRVQ6J3dhbGxldCd9OyRo4oCNX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuXG5oYXJkZW4oQnJpZGdlSWQpO1xuXG5jb25zdCAgICAgICAgV2FsbGV0TmFtZT17XG5kZXBvc2l0RmFjZXQ6J2RlcG9zaXRGYWNldCd9OyRo4oCNX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcblxuaGFyZGVuKFdhbGxldE5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyaWRnZUlkIjpbIkJyaWRnZUlkIl0sIldhbGxldE5hbWUiOlsiV2FsbGV0TmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACv9CbIfQEAAH0BAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi91dGlscy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdXRpbHMuanNcIiwgW11dLFtcIi4vY29uZmlnLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACtprWJjQAACY0AAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYXBwbHlMYWJlbGluZ0Vycm9yIiwiYmluZEFsbE1ldGhvZHMiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmcm9tVW5pcXVlRW50cmllcyIsImZzU3RyZWFtUmVhZHkiLCJnZXRNZXRob2ROYW1lcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3R5cGVzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuY29uc3R7b3duS2V5cyxhcHBseX09UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIFRocm93cyBpZiBtdWx0aXBsZSBlbnRyaWVzIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lLiBPdGhlcndpc2UgYWN0c1xuICogbGlrZSBgT2JqZWN0LmZyb21FbnRyaWVzYCBidXQgaGFyZGVucyB0aGUgcmVzdWx0LlxuICogVXNlIGl0IHRvIHByb3RlY3QgZnJvbSBwcm9wZXJ0eSBuYW1lcyBjb21wdXRlZCBmcm9tIHVzZXItcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLFZdPn0gYWxsRW50cmllc1xuICogQHJldHVybnMge3tbazogS106IFZ9fVxuICovXG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bmV3IFNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gbGVmdE5hbWVzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IHJpZ2h0TmFtZXNcbiAqL1xuY29uc3QgICAgICAgIGxpc3REaWZmZXJlbmNlPShsZWZ0TmFtZXMscmlnaHROYW1lcyk9PntcbmNvbnN0IHJpZ2h0U2V0PW5ldyBTZXQocmlnaHROYW1lcyk7XG5yZXR1cm4gbGVmdE5hbWVzLmZpbHRlcigobmFtZSk9PiFyaWdodFNldC5oYXMobmFtZSkpO1xuIH07JGjigI1fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIElmIHJlc3VsdCBpcyBhIHJlamVjdGVkIHByb21pc2UsIHRoaXMgd2lsbCovXG4vKiByZXR1cm4gYSBwcm9taXNlIHdpdGggYSBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMqL1xuLyogY29uZnVzZXMgVHlwZVNjcmlwdCBiZWNhdXNlIGl0IHR5cGVzIHRoYXQgY2FzZSBhcyBgUHJvbWlzZTxuZXZlcj5gKi9cbi8qIHdoaWNoIGlzIGNvb2wgZm9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgbmV2ZXIgZnVsZmxsLiovXG4vKiBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAqL1xuLyogc2hvdWxkIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbnJldHVybiBFLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+dGhyb3dMYWJlbGVkKHJlYXNvbixsYWJlbCkpO1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfTskaOKAjV9vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpe1xuLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbmlmKHR5cGVvZiB2YWxbbmFtZV09PT0nZnVuY3Rpb24nKXtcbm5hbWVzLmFkZChuYW1lKTtcbiB9XG4gfVxuaWYoIWlzT2JqZWN0KHZhbCkpe1xuYnJlYWs7XG4gfVxubGF5ZXI9Z2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuIH1cbnJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xuIH07JGjigI1fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKipcbiAqIFRPRE8gVGhpcyBmdW5jdGlvbiBleGlzdHMgb25seSB0byBlYXNlIHRoZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTk3MCB0cmFuc2l0aW9uLCBmcm9tIGFsbCBtZXRob2RzXG4gKiBiZWluZyBvd24gcHJvcGVydGllcyB0byBtZXRob2RzIGJlaW5nIGluaGVyaXRlZCBmcm9tIGEgY29tbW9uIHByb3RvdHlwZS5cbiAqIFRoaXMgdHJhbnNpdGlvbiBicmVha3MgdHdvIHBhdHRlcm5zIHVzZWQgaW4gcHJpb3IgY29kZTogYXV0b2JpbmRpbmcsXG4gKiBhbmQgZW51bWVyYXRpbmcgbWV0aG9kcyBieSBlbnVtZXJhdGluZyBvd24gcHJvcGVydGllcy4gRm9yIGJvdGgsIHRoZVxuICogcHJlZmVycmVkIHJlcGFpcnMgYXJlXG4gKiAgICAqIGF1dG9iaW5kaW5nOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSxcbiAqICAgICAgYGZvbyhvYmoubWV0aG9kKWAgd2l0aCBgZm9vKGFyZyA9PiBgb2JqLm1ldGhvZChhcmcpKWAuIElPVywgc3RvcCByZWx5aW5nXG4gKiAgICAgIG9uIGV4cHJlc3Npb25zIGxpa2UgYG9iai5tZXRob2RgIHRvIGV4dHJhY3QgYSBtZXRob2Qgc3RpbGwgYm91bmQgdG8gdGhlXG4gKiAgICAgIHN0YXRlIG9mIGBvYmpgIGJlY2F1c2UsIGZvciB2aXJ0dWFsIGFuZCBkdXJhYmxlIG9iamVjdHMsXG4gKiAgICAgIHRoZXkgbm8gbG9uZ2VyIHdpbGwgYWZ0ZXIgIzU5NzAuXG4gKiAgICAqIG1ldGhvZCBlbnVtZXJhdGlvbjogUmVwbGFjZSwgZm9yIGV4YW1wbGVcbiAqICAgICAgYFJlZmxlY3Qub3duS2V5cyhvYmopYCB3aXRoIGBnZXRNZXRob2ROYW1lcyhvYmopYC5cbiAqXG4gKiBPbmNlIGFsbCBwcm9ibGVtYXRpYyBjYXNlcyBoYXZlIGJlZW4gY29udmVydGVkIGluIHRoaXMgbWFubmVyLCB0aGlzXG4gKiBgYmluZEFsbE1ldGhvZHNgIGhhY2sgY2FuIGFuZCBUT0RPIHNob3VsZCBiZSBkZWxldGVkLiBIb3dldmVyLCB3ZSBjdXJyZW50bHlcbiAqIGhhdmUgbm8gcmVsaWFibGUgc3RhdGljIHdheSB0byB0cmFjayBkb3duIGFuZCBmaXggYWxsIGF1dG9iaW5kaW5nIHNpdGVzLlxuICogRm9yIHRob3NlIG9iamVjdHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBmdWxseSByZXBhaXJlZCBieSB0aGUgYWJvdmUgdHdvXG4gKiB0ZWNobmlxdWVzLCBgYmluZEFsbE1ldGhvZHNgIGNyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBtdWNoIGxpa2UgdGhlXG4gKiBwcmUtIzU5NzAgb2JqZWN0cywgd2l0aCBhbGwgdGhlaXIgbWV0aG9kcyBhcyBpbnN0YW5jZS1ib3VuZCBvd24gcHJvcGVydGllcy5cbiAqIEl0IGRvZXMgdGhpcyBieSBtYWtpbmcgYSBuZXcgb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgb2JqYCB3aGVyZSB0aGUgbmV3XG4gKiBvYmplY3QgaGFzIGJvdW5kIG93biBtZXRob2RzIG92ZXJyaWRkaW5nIGFsbCB0aGUgbWV0aG9kcyBpdCB3b3VsZCBoYXZlXG4gKiBpbmhlcml0ZWQgZnJvbSBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gb2JqXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlfVxuICovXG5jb25zdCAgICAgICAgYmluZEFsbE1ldGhvZHM9KG9iaik9PlxuaGFyZGVuKFxuY3JlYXRlKFxub2JqLFxuZnJvbUVudHJpZXMoXG5nZXRNZXRob2ROYW1lcyhvYmopLm1hcCgobmFtZSk9Pltcbm5hbWUsXG57XG52YWx1ZTooLyoqIEB0eXBlIHt1bmtub3duW119ICovLi4uYXJncyk9PlxuYXBwbHkob2JqW25hbWVdLG9iaixhcmdzKSxcbmVudW1lcmFibGU6dHJ1ZX1dKSkpKTskaOKAjV9vbmNlLmJpbmRBbGxNZXRob2RzKGJpbmRBbGxNZXRob2RzKTtcblxuXG5cblxuXG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBEZWVwbHlBd2FpdGVkPFRbS10+IH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIENhdmVhdHM6XG4gKiAtIGRvZXNuJ3QgcmVjdXIgd2l0aGluIFByb21pc2UgcmVzdWx0c1xuICogLSByZXN1bHRpbmcgdHlwZSBoYXMgd3JhcHBlciBpbiBpdHMgbmFtZVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT4gPyBBd2FpdGVkPFQ+IDogVCBleHRlbmRzIHt9ID8gRGVlcGx5QXdhaXRlZE9iamVjdDxUPiA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEEgbW9yZSBjb25zdHJhaW5lZCB2ZXJzaW9uIG9mIHtkZWVwbHlGdWxmaWxsZWR9IGZvciB0eXBlIHNhZmV0eSB1bnRpbCBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWQgaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9KG9iaik9PntcbmFzc2VydChpc09iamVjdChvYmopLCdwYXJhbSBtdXN0IGJlIGFuIG9iamVjdCcpO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuLyoqIEBwYXJhbSB7KCkgPT4gYW55fSBmbiAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPW5ldyBFcnJvcihtZXNzYWdlKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVycix7XG5uYW1lOntcbnZhbHVlOidBZ2dyZWdhdGVFcnJvcid9LFxuXG5lcnJvcnM6e1xudmFsdWU6ZXJyb3JzfX0pO1xuXG5cbnJldHVybiBlcnI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtyZWFkb25seSAoVCB8IFByb21pc2VMaWtlPFQ+KVtdfSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaOKAjV9vbmNlLm1ha2VBZ2dyZWdhdGVFcnJvcihtYWtlQWdncmVnYXRlRXJyb3IpO1xuY29uc3QgICAgICAgIFByb21pc2VBbGxPckVycm9ycz1hc3luYyh2YWx1ZXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHZhbHVlcykudGhlbigocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz0vKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqL1xucmVzdWx0cy5maWx0ZXIoKHtzdGF0dXN9KT0+c3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoKHJlc3VsdCk9PnJlc3VsdC5yZWFzb24pO1xuaWYoIWVycm9ycy5sZW5ndGgpe1xucmV0dXJuICgvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi9yZXN1bHRzLm1hcChcbihyZXN1bHQpPT5yZXN1bHQudmFsdWUpKTtcblxuIH1lbHNlIGlmKGVycm9ycy5sZW5ndGg9PT0xKXtcbnRocm93IGVycm9yc1swXTtcbiB9ZWxzZXtcbnRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuIH1cbiB9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHs8VD4oXG4gKiAgIHRyaWVyOiAoKSA9PiBQcm9taXNlPFQ+LFxuICogIGZpbmFsaXplcjogKGVycm9yPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPixcbiAqICkgPT4gUHJvbWlzZTxUPn1cbiAqLyRo4oCNX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7Y29uc3QgYWdncmVnYXRlVHJ5RmluYWxseT1hc3luYyh0cmllcixmaW5hbGl6ZXIpPT5cbnRyaWVyKCkudGhlbihcbmFzeW5jKHJlc3VsdCk9PmZpbmFsaXplcigpLnRoZW4oKCk9PnJlc3VsdCksXG5hc3luYyh0cnlFcnJvcik9PlxuZmluYWxpemVyKHRyeUVycm9yKS5cbnRoZW4oXG4oKT0+dHJ5RXJyb3IsXG4oZmluYWxpemVFcnJvcik9Pm1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsZmluYWxpemVFcnJvcl0pKS5cblxudGhlbigoZXJyb3IpPT5Qcm9taXNlLnJlamVjdChlcnJvcikpKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydChcImZzXCIpLlJlYWRTdHJlYW0gfCBYaW1wb3J0KFwiZnNcIikuV3JpdGVTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5jb25zdCAgICAgICAgZnNTdHJlYW1SZWFkeT0oc3RyZWFtKT0+XG5uZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57XG5pZihzdHJlYW0uZGVzdHJveWVkKXtcbnJlamVjdChuZXcgRXJyb3IoJ1N0cmVhbSBhbHJlYWR5IGRlc3Ryb3llZCcpKTtcbnJldHVybjtcbiB9XG5cbmlmKCFzdHJlYW0ucGVuZGluZyl7XG5yZXNvbHZlKCk7XG5yZXR1cm47XG4gfVxuXG5jb25zdCBvblJlYWR5PSgpPT57XG5jbGVhbnVwKCk7LyogZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXNvbHZlKCk7XG4gfTtcblxuLyoqIEBwYXJhbSB7RXJyb3J9IGVyciAqL1xuY29uc3Qgb25FcnJvcj0oZXJyKT0+e1xuY2xlYW51cCgpOy8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmVqZWN0KGVycik7XG4gfTtcblxuY29uc3QgY2xlYW51cD0oKT0+e1xuc3RyZWFtLm9mZigncmVhZHknLG9uUmVhZHkpO1xuc3RyZWFtLm9mZignZXJyb3InLG9uRXJyb3IpO1xuIH07XG5cbnN0cmVhbS5vbigncmVhZHknLG9uUmVhZHkpO1xuc3RyZWFtLm9uKCdlcnJvcicsb25FcnJvcik7XG4gfSk7JGjigI1fb25jZS5mc1N0cmVhbVJlYWR5KGZzU3RyZWFtUmVhZHkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sIm9iamVjdE1hcCI6WyJvYmplY3RNYXAiXSwibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXSwidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdLCJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl0sImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwibWFrZU1lYXN1cmVTZWNvbmRzIjpbIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJtYWtlQWdncmVnYXRlRXJyb3IiOlsibWFrZUFnZ3JlZ2F0ZUVycm9yIl0sIlByb21pc2VBbGxPckVycm9ycyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiXSwiYWdncmVnYXRlVHJ5RmluYWxseSI6WyJhZ2dyZWdhdGVUcnlGaW5hbGx5Il0sImZzU3RyZWFtUmVhZHkiOlsiZnNTdHJlYW1SZWFkeSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABS8904iAsAAIgLAAAiAAAAQGFnb3JpYy9uYXQtdjQuMS4wL2Rpc3QvbmF0LmVzbS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7YW55fSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50IHwgbnVtYmVyfSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IG5ldyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAd0s+I6MdAACjHQAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInVwZGF0ZUZyb21JdGVyYWJsZSIsInVwZGF0ZUZyb21Ob3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9tYXN0ZXIvbWFpbi9kaXN0cmlidXRlZC1wcm9ncmFtbWluZy5tZCNub3RpZmllcnNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0NvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9KG5vdGlmaWVyUCk9PntcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmFibGVGcm9tTm90aWZpZXInLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pntcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnR9ICovXG5sZXQgbG9jYWxVcGRhdGVDb3VudDtcbi8qKiBAdHlwZSB7UHJvbWlzZTx7dmFsdWU6IFQsIGRvbmU6IGJvb2xlYW59PiB8IHVuZGVmaW5lZH0gKi9cbmxldCBteUl0ZXJhdGlvblJlc3VsdFA7XG5yZXR1cm4gRmFyKCdhc3luY0l0ZXJhdG9yRnJvbU5vdGlmaWVyJyx7XG5uZXh0OigpPT57XG5pZighbXlJdGVyYXRpb25SZXN1bHRQKXtcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4qL1xuLyogdW5yZXNvbHZlZCBwcm9taXNlLCBgbXlJdGVyYXRpb25SZXN1bHRQYCwgYW5kIHVudGlsKi9cbi8qIGBteUl0ZXJhdGlvblJlc3VsdFBgIGlzIGZ1bGZpbGxlZCB3aXRoIGFuKi9cbi8qIGl0ZXJhdGlvbiByZXN1bHQsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgcHJvbWlzZSBhZ2FpbiB3aXRob3V0IGFza2luZyB0aGUgbm90aWZpZXIqL1xuLyogZm9yIG1vcmUgdXBkYXRlcy4gSWYgdGhlcmUncyBhbHJlYWR5IGFuIHVuYW5zd2VyZWQgYXNrIGluIHRoZSovXG4vKiBhaXIsIGFsbCBmdXJ0aGVyIGFza3Mgc2hvdWxkIGp1c3QgcmV1c2UgdGhlIHJlc3VsdCBvZiB0aGF0IG9uZS4qL1xuLyoqL1xuLyogVGhpcyByZXVzZSBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlIGFzeW5jKi9cbi8qIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4vKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkKi9cbi8qIGFmdGVyIHRoZSBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMqL1xuLyogZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiovXG4vKiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCBhZ2Fpbi4qL1xuLyoqL1xuLyogU2VlKi9cbi8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4vKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5teUl0ZXJhdGlvblJlc3VsdFA9RShub3RpZmllclApLlxuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCkuXG50aGVuKCh7dmFsdWUsdXBkYXRlQ291bnR9KT0+e1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcbmNvbnN0IGRvbmU9bG9jYWxVcGRhdGVDb3VudD09PXVuZGVmaW5lZDtcbmlmKCFkb25lKXtcbi8qIE9uY2UgdGhlIG91dHN0YW5kaW5nIHF1ZXN0aW9uIGhhcyBiZWVuIGFuc3dlcmVkLCBzdG9wKi9cbi8qIHVzaW5nIHRoYXQgYW5zd2VyLCBzbyBhbnkgZnVydGhlciBgbmV4dCgpYCBxdWVzdGlvbnMqL1xuLyogY2F1c2UgYSBuZXcgYGdldFVwZGF0ZVNpbmNlYCByZXF1ZXN0LiovXG4vKiovXG4vKiBCdXQgb25seSBpZiBtb3JlIGFuc3dlcnMgYXJlIGV4cGVjdGVkLiBPbmNlIHRoZSBub3RpZmllciovXG4vKiBpcyBgZG9uZWAsIHRoYXQgd2FzIHRoZSBsYXN0IGFuc3dlciBzbyByZXVzZSBpdCBmb3JldmVyLiovXG5teUl0ZXJhdGlvblJlc3VsdFA9dW5kZWZpbmVkO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9KTtcbiB9XG4vKiB4eHggaGludCBmb3IgdHlwZSBjaGVja2VyKi9cbmFzc2VydChteUl0ZXJhdGlvblJlc3VsdFApO1xucmV0dXJuIG15SXRlcmF0aW9uUmVzdWx0UDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0b3I9KGFzeW5jSXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xucmV0dXJuIG5ldyBQcm9taXNlKChhY2ssb2JzZXJ2ZXJFcnJvcik9PntcbmNvbnN0IHJlY3VyPSgpPT57XG5FLndoZW4oXG5FKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4oe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG5pdGVyYXRpb25PYnNlcnZlci5maW5pc2gmJml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG5hY2sodW5kZWZpbmVkKTtcbiB9ZWxzZXtcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlJiZcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbnJlY3VyKCk7XG4gfVxuIH0sXG4ocmVhc29uKT0+e1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuYWNrKHVuZGVmaW5lZCk7XG4gfSkuXG5jYXRjaChvYnNlcnZlckVycm9yKTtcbiB9O1xucmVjdXIoKTtcbiB9KTtcbiB9O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRpb249KGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xucmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBvYnNlcnZlSXRlcmF0aW9uYCBpbnN0ZWFkXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbUl0ZXJhYmxlPShpdGVyYXRpb25PYnNlcnZlcixhc3luY0l0ZXJhYmxlUCk9Plxub2JzZXJ2ZUl0ZXJhdGlvbihhc3luY0l0ZXJhYmxlUCxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLnVwZGF0ZUZyb21JdGVyYWJsZSh1cGRhdGVGcm9tSXRlcmFibGUpO1xuY29uc3QgICAgICAgIG9ic2VydmVOb3RpZmllcj0obm90aWZpZXJQLGl0ZXJhdGlvbk9ic2VydmVyKT0+XG5vYnNlcnZlSXRlcmF0aW9uKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSAnb2JzZXJ2ZU5vdGlmaWVyYCBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclBcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIHVwZGF0ZUZyb21Ob3RpZmllcj0oaXRlcmF0aW9uT2JzZXJ2ZXIsbm90aWZpZXJQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpOyRo4oCNX29uY2UudXBkYXRlRnJvbU5vdGlmaWVyKHVwZGF0ZUZyb21Ob3RpZmllcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwidXBkYXRlRnJvbUl0ZXJhYmxlIjpbInVwZGF0ZUZyb21JdGVyYWJsZSJdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIl0sInVwZGF0ZUZyb21Ob3RpZmllciI6WyJ1cGRhdGVGcm9tTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHa5YMuoJAADqCQAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVB1Ymxpc2hLaXQiLCJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0IiwidXBkYXRlRnJvbUl0ZXJhYmxlIiwidXBkYXRlRnJvbU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6WyIuL3N0b3Jlc3ViLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUHVibGlzaEtpdFwiXV1dLFtcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2xpdmVbXCJzdWJzY3JpYmVFYWNoXCJdXV0sW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9saXZlW1wic3Vic2NyaWJlTGF0ZXN0XCJdXV1dXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtbXCJtYWtlTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJcIl1dXSxbXCJtYWtlTm90aWZpZXJLaXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJLaXRcIl1dXSxbXCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlXCJdXV0sW1wibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiXV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uXCIsIFskaOKAjV9saXZlW1wibWFrZVN1YnNjcmlwdGlvblwiXV1dLFtcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCJdXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlTm90aWZpZXJcIl1dXSxbXCJvYnNlcnZlSXRlcmF0b3JcIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlSXRlcmF0b3JcIl1dXSxbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZUl0ZXJhdGlvblwiXV1dLFtcInVwZGF0ZUZyb21JdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcInVwZGF0ZUZyb21JdGVyYWJsZVwiXV1dLFtcInVwZGF0ZUZyb21Ob3RpZmllclwiLCBbJGjigI1fbGl2ZVtcInVwZGF0ZUZyb21Ob3RpZmllclwiXV1dLFtcIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIl1dXV1dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiLGZhbHNlXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIixmYWxzZV0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiLGZhbHNlXSwibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciIsZmFsc2VdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0IixmYWxzZV0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIixmYWxzZV0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIixmYWxzZV0sIm1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiIsZmFsc2VdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiLGZhbHNlXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciIsZmFsc2VdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIixmYWxzZV0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiIsZmFsc2VdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIixmYWxzZV0sInVwZGF0ZUZyb21Ob3RpZmllciI6WyJ1cGRhdGVGcm9tTm90aWZpZXIiLGZhbHNlXSwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOa9HeEAqAABAKgAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsbWFrZVByb21pc2VLaXQsRSxGYXIsbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiLCBbJGjigI1fYSA9PiAobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPiB8IE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPiAmIFNoYXJhYmxlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9PntcbmNvbnN0IGFzeW5jSXRlcmFibGU9bWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoc2hhcmFibGVJbnRlcm5hbHNQKTtcblxuLyoqIEB0eXBlIHtBc3luY0l0ZXJhYmxlPFQ+ICYgU2hhcmFibGVOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLmFzeW5jSXRlcmFibGUsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5zaGFyYWJsZUludGVybmFsc1AsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcktpdD0oLi4uaW5pdGlhbFN0YXRlQXJyKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlUmVjb3JkPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlS2l0O1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIChudW1iZXIgfCB1bmRlZmluZWQpfSAqL1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0xOy8qIGF2b2lkIGZhbHN5IG51bWJlcnMqL1xuLyoqIEB0eXBlIHtVcGRhdGVSZWNvcmQ8VD58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcblxuY29uc3QgaGFzU3RhdGU9KCk9PmN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZDtcblxuY29uc3QgZmluYWw9KCk9PmN1cnJlbnRVcGRhdGVDb3VudD09PXVuZGVmaW5lZDtcblxuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG4vKiBOYU4gbWF0Y2hlcyBub3RoaW5nKi9cbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PU5hTil7XG5pZihcbmhhc1N0YXRlKCkmJihcbmZpbmFsKCl8fFxuY3VycmVudFJlc3BvbnNlJiZjdXJyZW50UmVzcG9uc2UudXBkYXRlQ291bnQhPT11cGRhdGVDb3VudCkpXG57XG4vKiBJZiBoYXNTdGF0ZSgpIGFuZCBlaXRoZXIgaXQgaXMgZmluYWwoKSBvciBpdCBpcyovXG4vKiBub3QgdGhlIHN0YXRlIG9mIHVwZGF0ZUNvdW50LCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuKi9cbmFzc2VydChjdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQpO1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbi8qIG90aGVyd2lzZSByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoIW9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0PW1ha2VQcm9taXNlS2l0KCk7XG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlS2l0LnByb21pc2U7XG4gfX0pO1xuXG5cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyfSk7XG5cblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlKHN0YXRlKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lIGhhc1N0YXRlKCkgJiYgIWZpbmFsKCkqL1xuYXNzZXJ0KGN1cnJlbnRVcGRhdGVDb3VudCk7XG5jdXJyZW50VXBkYXRlQ291bnQrPTE7XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlOnN0YXRlLFxudXBkYXRlQ291bnQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbmlmKG9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0LnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbm9wdE5leHRQcm9taXNlS2l0PXVuZGVmaW5lZDtcbiB9XG4gfSxcblxuZmluaXNoKGZpbmFsU3RhdGUpe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5pc2ggYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgaGFzU3RhdGUoKSAmJiBmaW5hbCgpKi9cbmN1cnJlbnRVcGRhdGVDb3VudD11bmRlZmluZWQ7XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlOmZpbmFsU3RhdGUsXG51cGRhdGVDb3VudDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxuaWYob3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xub3B0TmV4dFByb21pc2VLaXQ9dW5kZWZpbmVkO1xuIH1cbiB9LFxuXG5mYWlsKHJlYXNvbil7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IGZhaWwgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgIWhhc1N0YXRlKCkgJiYgZmluYWwoKSovXG5jdXJyZW50VXBkYXRlQ291bnQ9dW5kZWZpbmVkO1xuY3VycmVudFJlc3BvbnNlPXVuZGVmaW5lZDtcbmlmKCFvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuIH1cbi8qIERvbid0IHRyaWdnZXIgTm9kZS5qcydzIFVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25XYXJuaW5nKi9cbm9wdE5leHRQcm9taXNlS2l0LnByb21pc2UuY2F0Y2goKF8pPT57IH0pO1xub3B0TmV4dFByb21pc2VLaXQucmVqZWN0KHJlYXNvbik7XG4gfX0pO1xuXG5cbmFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoPD0xLCd0b28gbWFueSBhcmd1bWVudHMnKTtcbmlmKGluaXRpYWxTdGF0ZUFyci5sZW5ndGg9PT0xKXtcbnVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiB9XG5cbi8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuLyogaXMgdGlnaHRseSBoZWxkKi9cbnJldHVybiBoYXJkZW4oe25vdGlmaWVyLHVwZGF0ZXJ9KTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyUCk9Pntcbi8qKiBAdHlwZSB7YmlnaW50fSAqL1xubGV0IGxhdGVzdEluYm91bmRDb3VudDtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiBiaWdpbnR9ICovXG5sZXQgbGF0ZXN0VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge1dlYWtNYXA8UHVibGljYXRpb25SZWNvcmQ8VD4sIFByb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pj59ICovXG5jb25zdCBvdXRib3VuZFJlc3VsdHM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uUmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59XG4gKi9cbmNvbnN0IHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuLyogTGV2ZXJhZ2UgaWRlbnRpdHkgcHJlc2VydmF0aW9uIG9mIGByZWNvcmRgLiovXG5jb25zdCBleGlzdGluZ091dGJvdW5kUmVzdWx0PW91dGJvdW5kUmVzdWx0cy5nZXQocmVjb3JkKTtcbmlmKGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQpe1xucmV0dXJuIGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQ7XG4gfVxuXG5sYXRlc3RJbmJvdW5kQ291bnQ9cmVjb3JkLnB1Ymxpc2hDb3VudDtcbmxhdGVzdFVwZGF0ZUNvdW50Kz0xbjtcbmNvbnN0IHJlc3VsdFA9RS53aGVuKHJlY29yZC5oZWFkLCh7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OmxhdGVzdFVwZGF0ZUNvdW50fSk7XG4gfSk7XG5vdXRib3VuZFJlc3VsdHMuc2V0KHJlY29yZCxyZXN1bHRQKTtcbnJldHVybiByZXN1bHRQO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtCYXNlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9LTFuKXtcbmFzc2VydChcbnVwZGF0ZUNvdW50PD1sYXRlc3RVcGRhdGVDb3VudCxcbidhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cblxuaWYodXBkYXRlQ291bnQ8bGF0ZXN0VXBkYXRlQ291bnQpe1xuLyogUmV0dXJuIHRoZSBtb3N0IHJlY2VudCByZXN1bHQgcG9zc2libGUgd2l0aG91dCBpbXBvc2luZyBhbiB1bm5lY2Vzc2FyeSBkZWxheS4qL1xucmV0dXJuIEUoc3Vic2NyaWJlclApLlxuc3Vic2NyaWJlQWZ0ZXIoKS5cbnRoZW4odHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkKTtcbiB9XG5cbi8qIFJldHVybiBhIHJlc3VsdCB0aGF0IGZvbGxvd3MgdGhlIGxhc3QtcmV0dXJuZWQgcmVzdWx0LCovXG4vKiBza2lwcGluZyBvdmVyIGludGVybWVkaWF0ZSByZXN1bHRzIGlmIGxhdGVzdEluYm91bmRDb3VudCovXG4vKiBubyBsb25nZXIgY29ycmVzcG9uZHMgd2l0aCB0aGUgbGF0ZXN0IHJlc3VsdC4qL1xuLyogTm90ZSB0aGF0IHVubGlrZSBub3RpZmllcnMgYW5kIHN1YnNjcmliZXJzIHJlc3BlY3RpdmVseSByZXR1cm5lZCBieSovXG4vKiBtYWtlTm90aWZpZXJLaXQgYW5kIG1ha2VQdWJsaXNoS2l0LCB0aGlzIHJlc3VsdCBpcyBub3QgZ3VhcmFudGVlZCovXG4vKiB0byBmb2xsb3cgdGhlIHJlc3VsdCByZXR1cm5lZCB3aGVuIGEgbm9uLWxhdGVzdCB1cGRhdGVDb3VudCBpcyBwcm92aWRlZCovXG4vKiAoZS5nLiwgaXQgaXMgcG9zc2libGUgZm9yIGBub3RpZmllckZyb21TdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKClgIGFuZCovXG4vKiBgbm90aWZpZXJGcm9tU3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZShsYXRlc3RVcGRhdGVDb3VudClgIHRvIGJvdGgqL1xuLyogc2V0dGxlIHRvIHRoZSBzYW1lIG9iamVjdCBgbmV3TGF0ZXN0YCB3aGVyZSBgbmV3TGF0ZXN0LnVwZGF0ZUNvdW50YCovXG4vKiBpcyBvbmUgZ3JlYXRlciB0aGFuIGBsYXRlc3RVcGRhdGVDb3VudGApLiovXG5yZXR1cm4gRShzdWJzY3JpYmVyUCkuXG5zdWJzY3JpYmVBZnRlcihsYXRlc3RJbmJvdW5kQ291bnQpLlxudGhlbih0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcixcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PmJhc2VOb3RpZmllcixcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIGJpZ2ludH0gKi9cbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xubGV0IGZpbmFsPWZhbHNlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7QmFzZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgbmV3IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+YmFzZU5vdGlmaWVyLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABSS0CSLFwAAixcAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VQdWJsaXNoS2l0Iiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBIYW5kbGVkUHJvbWlzZSxFLG1ha2VQcm9taXNlS2l0LEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJIYW5kbGVkUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoSGFuZGxlZFByb21pc2UgPSAkaOKAjV9hKV1dLFtcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0IHNpbms9KCk9PnsgfTtcblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25MaXN0IGFzIGl0IGFwcGVhcnMuXG4gKiBBcyBpdCBwcm9jZWVkcywgaXQgbXVzdCBkcm9wIHRoZSBwYXJ0cyBvZiB0aGUgbGlzdCBpdCBubyBsb25nZXIgbmVlZHMuXG4gKiBUaHVzLCBpZiBubyBvbmUgZWxzZSBpcyBob2xkaW5nIG9uIHRvIHRob3NlLCBpdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25MaXN0PFQ+fSBwdWJMaXN0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvcj0ocHViTGlzdCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5yZXR1cm4gRmFyKCdFYWNoSXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0IHJlc3VsdFA9RS5nZXQocHViTGlzdCkuaGVhZDtcbnB1Ykxpc3Q9RS5nZXQocHViTGlzdCkudGFpbDtcbi8qIFdlIGV4cGVjdCB0aGUgdGFpbCB0byBiZSB0aGUgXCJjYW5ub3QgcmVhZCBwYXN0IGVuZFwiIGVycm9yIGF0IHRoZSBlbmQqL1xuLyogb2YgdGhlIGhhcHB5IHBhdGguKi9cbi8qIFNpbmNlIHdlIGFyZSB3cmFwcGluZyB0aGF0IGVycm9yIHdpdGggZXZlbnR1YWwgc2VuZCwgd2Ugc2luayB0aGUqL1xuLyogcmVqZWN0aW9uIGhlcmUgdG9vIHNvIGl0IGRvZXNuJ3QgYmVjb21lIGFuIGludmFsaWQgdW5oYW5kbGVkIHJlamVjdGlvbiovXG4vKiBsYXRlci4qL1xudm9pZCBFLndoZW4ocHViTGlzdCxzaW5rLHNpbmspO1xucmV0dXJuIHJlc3VsdFA7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJwcmVmaXggbG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwicHJlZml4IGxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgZXZlcnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlXG4gKiB5b3UgYXNrIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBmb3IgYW4gaXRlcmF0b3IuIEJ1dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3JcbiAqIHdpbGwgZW51bWVyYXRlIGVhY2ggdGhpbmcgcHVibGlzaGVkIGZyb20gdGhhdCBpdGVyYXRvcidzIHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVFYWNoPShzdWJzY3JpYmVyKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdFYWNoSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IHB1Ykxpc3Q9RShzdWJzY3JpYmVyKS5zdWJzY3JpYmVBZnRlcigpO1xucmV0dXJuIG1ha2VFYWNoSXRlcmF0b3IocHViTGlzdCk7XG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvcj0oc3Vic2NyaWJlcik9PntcbmxldCBsYXRlc3RQdWJsaXNoQ291bnQ7XG5yZXR1cm4gRmFyKCdMYXRlc3RJdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3QgcHViTGlzdD1FKHN1YnNjcmliZXIpLnN1YnNjcmliZUFmdGVyKGxhdGVzdFB1Ymxpc2hDb3VudCk7XG4vKiBXaXRob3V0IGFuIG9uUmVqZWN0aW9uLCBpZiBwdWJMaXN0IGlzIGEgcmVqZWN0aW9uLCB0aGlzIHdpbGwqL1xuLyogcHJvcGFnYXRlIHRoZSByZWplY3Rpb24gYXMgaXQgc2hvdWxkLiovXG5yZXR1cm4gRS53aGVuKHB1Ykxpc3QsKHtoZWFkLHB1Ymxpc2hDb3VudH0pPT57XG5sYXRlc3RQdWJsaXNoQ291bnQ9cHVibGlzaENvdW50O1xucmV0dXJuIGhlYWQ7XG4gfSk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGFueSBwdWJsaXNoZWQgc3RhdGUgaWYgYSBtb3JlXG4gKiByZWNlbnQgcHVibGlzaGVkIHN0YXRlIGNhbiBiZSByZXBvcnRlZCBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVMYXRlc3Q9KHN1YnNjcmliZXIpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0xhdGVzdEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlTGF0ZXN0SXRlcmF0b3Ioc3Vic2NyaWJlcil9KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UHVibGlzaEtpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQdWJsaXNoS2l0PSgpPT57XG4vKiogQHR5cGUge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSAqL1xubGV0IHRhaWxQO1xuLyoqIEB0eXBlIHt1bmRlZmluZWQgfCAoKHZhbHVlOiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+PikgPT4gdm9pZCl9ICovXG5sZXQgdGFpbFI7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG5cbmxldCBjdXJyZW50UHVibGlzaENvdW50PTBuO1xubGV0IGN1cnJlbnRQPXRhaWxQO1xuY29uc3QgYWR2YW5jZUN1cnJlbnQ9KGRvbmUsdmFsdWUscmVqZWN0aW9uKT0+e1xuaWYodGFpbFI9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuY3VycmVudFB1Ymxpc2hDb3VudCs9MW47XG5jdXJyZW50UD10YWlsUDtcbmNvbnN0IHJlc29sdmVDdXJyZW50PXRhaWxSO1xuXG5pZihkb25lKXtcbnRhaWxQPUhhbmRsZWRQcm9taXNlLnJlamVjdChcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcblxuLyogU3VwcHJlc3MgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvci4qL1xudGFpbFAuY2F0Y2goKCk9PnsgfSk7XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge1N1YnNjcmliZXI8VD59XG4gKi9cbmNvbnN0IHN1YnNjcmliZXI9RmFyKCdTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50PS0xbik9PntcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IG5ldyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH19KTtcblxuXG4vKiogQHR5cGUge1B1Ymxpc2hlcjxUPn0gKi9cbmNvbnN0IHB1Ymxpc2hlcj1GYXIoJ1B1Ymxpc2hlcicse1xucHVibGlzaDoodmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudChmYWxzZSx2YWx1ZSk7XG4gfSxcbmZpbmlzaDooZmluYWxWYWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KHRydWUsZmluYWxWYWx1ZSk7XG4gfSxcbmZhaWw6KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1IYW5kbGVkUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbi8qIFN1cHByZXNzIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3IuKi9cbnJlamVjdGlvbi5jYXRjaCgoKT0+eyB9KTtcbmFkdmFuY2VDdXJyZW50KHRydWUsdW5kZWZpbmVkLHJlamVjdGlvbik7XG4gfX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaXNoZXIsc3Vic2NyaWJlcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPJbLelGHgAARh4AACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlTWFyc2hhbCxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUVhY2gsbWFrZVN1YnNjcmlwdGlvbktpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dLFtcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuY29uc3QgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKSlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbndoaWxlKCFmaW5pc2hlZCl7XG4vKiBBbGxvdyBuZXN0ZWQgYXdhaXRzIChpbiBsb29wKSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgZWFjaCB0byBydW4gaW4gYSB0dXJuKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5jb25zdHt2YWx1ZSxkb25lfT1hd2FpdCBFKGl0ZXJhdG9yUCkubmV4dCgpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmliZXI9KHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydChzdWJzY3JpYmVyJiZzdG9yYWdlTm9kZSYmbWFyc2hhbGxlciwnbWlzc2luZyBhcmd1bWVudCcpO1xuXG5jb25zdCBzdG9yZVZhbHVlPSh2YWx1ZSk9PlxuRShtYXJzaGFsbGVyKS5cbnNlcmlhbGl6ZSh2YWx1ZSkuXG50aGVuKChzZXJpYWxpemVkKT0+e1xuY29uc3QgZW5jb2RlZD1KU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiB9KTtcblxuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlcixzdG9yZVZhbHVlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuXG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLnVuc2VyaWFsaXplKGRhdGEpfSk7XG5cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpYmVyJyx7XG4uLi5zdWJzY3JpYmVyLFxuZ2V0U3RvcmVLZXk6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uPShcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsdW5kZWZpbmVkLHtcbm1hcnNoYWxTYXZlRXJyb3I6KCk9PnsgfX0pKT0+XG5cbntcbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiBBYm9ydCB0aGUgaXRlcmF0aW9uIG9uIHRoZSBuZXh0IG9ic2VydmF0aW9uIGlmIHRoZSBwdWJsaXNoZXIgZXZlciBmYWlscy4qL1xubGV0IHB1Ymxpc2hGYWlsZWQ9ZmFsc2U7XG5sZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuY29uc3QgZmFpbD0oZXJyKT0+e1xucHVibGlzaEZhaWxlZD10cnVlO1xucHVibGlzaEV4Y2VwdGlvbj1lcnI7XG4gfTtcblxuLyogTXVzdCAqbm90KiBiZSBhbiBhc3luYyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBzb21ldGltZXMgbXVzdCB0aHJvdyB0byBhYm9ydCovXG4vKiB0aGUgaXRlcmF0aW9uLiovXG5jb25zdCBwdWJsaXNoVmFsdWU9KG9iaik9PntcbmFzc2VydChzdG9yYWdlTm9kZSk7XG5pZihwdWJsaXNoRmFpbGVkKXtcbi8qIFRvIHByb3Blcmx5IGFib3J0IHRoZSBpdGVyYXRpb24sIHRoaXMgbXVzdCBiZSBhIHN5bmNocm9ub3VzIGV4Y2VwdGlvbi4qL1xudGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiB9XG5cbi8qIFB1Ymxpc2ggdGhlIHZhbHVlLCBjYXB0dXJpbmcgYW55IGVycm9yLiovXG5FKG1hcnNoYWxsZXIpLlxuc2VyaWFsaXplKG9iaikuXG50aGVuKChzZXJpYWxpemVkKT0+e1xuY29uc3QgZW5jb2RlZD1KU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiB9KS5cbmNhdGNoKGZhaWwpO1xuIH07XG5cbmlmKHN0b3JhZ2VOb2RlKXtcbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24se1xudXBkYXRlU3RhdGU6cHVibGlzaFZhbHVlLFxuZmluaXNoOnB1Ymxpc2hWYWx1ZX0pLlxuY2F0Y2goZmFpbCk7XG4gfVxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaXB0aW9uJyx7XG5nZXRTdG9yZUtleTphc3luYygpPT57XG5pZighc3RvcmFnZU5vZGUpe1xucmV0dXJuIGhhcmRlbih7c3Vic2NyaXB0aW9ufSk7XG4gfVxuY29uc3Qgc3RvcmVLZXk9YXdhaXQgRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKTtcbnJldHVybiBoYXJkZW4oey4uLnN0b3JlS2V5LHN1YnNjcmlwdGlvbn0pO1xuIH0sXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcixcbmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOlxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpzdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hlcktpdFxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1Ymxpc2hlclxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcixjaGlsZFBhdGgpPT57XG5jb25zdHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259PW1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuaWYoc3RvcmFnZU5vZGUmJmNoaWxkUGF0aCl7XG5zdG9yYWdlTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gfVxuXG4vKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuY29uc3Qgc3Vic2NyaWJlcj1tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuXG5yZXR1cm57XG5wdWJsaXNoZXI6cHVibGljYXRpb24sXG5zdWJzY3JpYmVyfTtcblxuIH07XG5cbi8qKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRvEy5OQwAADkMAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZVB1Ymxpc2hLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvbjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbj0oc2hhcmFibGVJbnRlcm5hbHNQKT0+e1xuY29uc3Qgc3Vic2NyaXB0aW9uPUZhcignU3Vic2NyaXB0aW9uJyx7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZVN1YnNjcmlwdGlvbkl0ZXJhdG9yKHNoYXJhYmxlSW50ZXJuYWxzUCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqXG4gKiBAcmV0dXJucyB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59XG4gKi9cbmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOigpPT5zaGFyYWJsZUludGVybmFsc1AsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gdGFpbFBcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25JdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbkl0ZXJhdG9yPSh0YWlsUCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5yZXR1cm4gRmFyKCdTdWJzY3JpcHRpb25JdGVyYXRvcicse1xuc3Vic2NyaWJlOigpPT5tYWtlU3Vic2NyaXB0aW9uKHRhaWxQKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcih0YWlsUCksXG5uZXh0OigpPT57XG5jb25zdCByZXN1bHRQPUUuZ2V0KHRhaWxQKS5oZWFkO1xudGFpbFA9RS5nZXQodGFpbFApLnRhaWw7XG5Qcm9taXNlLnJlc29sdmUodGFpbFApLmNhdGNoKCgpPT57IH0pOy8qIHN1cHByZXNzIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3IqL1xucmV0dXJuIHJlc3VsdFA7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfWAgZm9yIGRvaW5nIGxvc3NsZXNzIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1Yi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvblJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbktpdD0oKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbi8qIFRoZSBwdWJsaXNoIGtpdCBzdWJzY3JpYmVyIGlzIHByZWZpeC1sb3NzeSwgc28gbWFraW5nICp0aGlzKiBzdWJzY3JpYmVyIGNvbXBsZXRlbHkqL1xuLyogbG9zc2xlc3MgcmVxdWlyZXMgZWFnZXIgY29uc3VtcHRpb24gb2YgdGhlIGZvcm1lci4qL1xuLyogU3VjaCBsb3NzbGVzc25lc3MgaW5oaWJpdHMgR0MsIHdoaWNoIGlzIHdoeSB3ZSdyZSBtb3ZpbmcgYXdheSBmcm9tIGl0LiovXG5jb25zdCBwdWJMaXN0PXN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKTtcbmNvbnN0IHN1YnNjcmlwdGlvbj1tYWtlU3Vic2NyaXB0aW9uKHB1Ykxpc3QpO1xuXG4vKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6cHVibGlzaGVyLnB1Ymxpc2gsXG5maW5pc2g6cHVibGlzaGVyLmZpbmlzaCxcbmZhaWw6cHVibGlzaGVyLmZhaWx9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259KTtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG3m3zOlIQAApSEAACwAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxUPn0gUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVwcmVjYXRlZC4gVXNlIFByb21pc2VLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZVJlY29yZDxUPn0gUHJvbWlzZVJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IEFzeW5jSXRlcmF0b3I8VCwgVD5cbiAqIH19IENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlXG4gKiBBbiBBc3luY0l0ZXJhYmxlIHRoYXQgcmV0dXJucyB0aGUgc2FtZSB0eXBlIGFzIGl0IHlpZWxkcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJdGVyYXRpb25PYnNlcnZlcjxUPlxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgdXBkYXRlU3RhdGVgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHVwZGF0ZVN0YXRlXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaWNhdGlvblJlY29yZFxuICogQHByb3BlcnR5IHtJdGVyYXRvclJlc3VsdDxUPn0gaGVhZFxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudFxuICogQHByb3BlcnR5IHtQdWJsaWNhdGlvbkxpc3Q8VD59IHRhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IFB1YmxpY2F0aW9uTGlzdFxuICogV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcywgc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyXG4gKiBzb2Z0d2FyZSBzaG91bGQgY29uc2lkZXIgaXQgb3BhcXVlLCBub3QgZGVwZW5kaW5nIG9uIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaWJlclxuICogQHByb3BlcnR5IHsocHVibGlzaENvdW50PzogYmlnaW50KSA9PiBQdWJsaWNhdGlvbkxpc3Q8VD59IHN1YnNjcmliZUFmdGVyXG4gKiBJbnRlcm5hbGx5IHVzZWQgdG8gZ2V0IHRoZSBcImN1cnJlbnRcIiBTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsc1xuICogaW4gb3JkZXIgdG8gbWFrZSBhIHN1YnNjcmlwdGlvbiBpdGVyYXRvciB0aGF0IHN0YXJ0cyB0aGVyZS5cbiAqIFRoZSBhbnN3ZXIgaXMgXCJjdXJyZW50XCIgaW4gdGhhdCBpdCB3YXMgYWNjdXJhdGUgYXQgc29tZSBtb21lbnQgYmV0d2VlblxuICogd2hlbiB5b3UgYXNrZWQgYW5kIHdoZW4geW91IGdvdCB0aGUgYW5zd2VyLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hlclxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgcHVibGlzaGAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gcHVibGlzaFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IGFueSkgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFB1Ymxpc2hlcjxUPj59IFB1Ymxpc2hPYnNlcnZlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETzogTmFycm93IHRvIGV4Y2x1ZGUgbnVtYmVyLiovXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWR9IFVwZGF0ZUNvdW50IGEgdmFsdWUgdXNlZCB0byBtYXJrIHRoZSBwb3NpdGlvblxuICogaW4gdGhlIHVwZGF0ZSBzdHJlYW0uIEZvciB0aGUgbGFzdCBzdGF0ZSwgdGhlIHVwZGF0ZUNvdW50IGlzIHVuZGVmaW5lZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVcGRhdGVSZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7VH0gdmFsdWUgaXMgd2hhdGV2ZXIgc3RhdGUgdGhlIHNlcnZpY2Ugd2FudHMgdG8gcHVibGlzaFxuICogQHByb3BlcnR5IHtVcGRhdGVDb3VudH0gdXBkYXRlQ291bnQgaXMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHVwZGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBHZXRVcGRhdGVTaW5jZTxUPiBDYW4gYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gZ2V0IGEgc2VxdWVuY2Ugb2ZcbiAqIHVwZGF0ZSByZWNvcmRzXG4gKiBAcGFyYW0ge1VwZGF0ZUNvdW50fSBbdXBkYXRlQ291bnRdIHJldHVybiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuIHVwZGF0ZVxuICogY291bnQuIElmIHRoZSBgdXBkYXRlQ291bnRgIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50XG4gKiB1cGRhdGUgY291bnQsIHJldHVybiB0aGUgY3VycmVudCByZWNvcmQuXG4gKiBPdGhlcndpc2UsIGFmdGVyIHRoZSBuZXh0IHN0YXRlIGNoYW5nZSwgdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIHRvIHRoZVxuICogdGhlbi1jdXJyZW50IHZhbHVlIG9mIHRoZSByZWNvcmQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSByZXNvbHZlcyB0byB0aGUgY29ycmVzcG9uZGluZ1xuICogdXBkYXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gQmFzZU5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGVcbiAqIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICogQHByb3BlcnR5IHtHZXRVcGRhdGVTaW5jZTxUPn0gZ2V0VXBkYXRlU2luY2UgcmV0dXJuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW5cbiAqIHVwZGF0ZSBjb3VudC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+fSBOb3RpZmllckludGVybmFscyBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLFxuICogc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyIHNvZnR3YXJlIHNob3VsZCBhdm9pZCBkZXBlbmRpbmcgb25cbiAqIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmXG4gKiAgIENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+ICZcbiAqICAgU2hhcmFibGVOb3RpZmllcjxUPlxuICogfSBOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxOb3RpZmllckludGVybmFsczxUPj59IGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBOb3RpZmljYXRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VOb3RpZmllcihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpZXJSZWNvcmQ8VD4gdGhlIHByb2R1Y2VkIG5vdGlmaWVyL3VwZGF0ZXIgcGFpclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gdXBkYXRlciB0aGUgKGNsb3NlbHktaGVsZCkgbm90aWZpZXIgcHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8VD59IG5vdGlmaWVyIHRoZSAod2lkZWx5LWhlbGQpIG5vdGlmaWVyIGNvbnN1bWVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD4gJlxuICogICBTaGFyYWJsZVN1YnNjcmlwdGlvbjxUPn0gU3Vic2NyaXB0aW9uPFQ+XG4gKiBBIGZvcm0gb2YgQXN5bmNJdGVyYWJsZSBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVTdWJzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgU3Vic2NyaXB0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlU3Vic2NyaXB0aW9uKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0FzeW5jSXRlcmF0b3I8VCwgVD4gJiBDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPn0gU3Vic2NyaXB0aW9uSXRlcmF0b3I8VD5cbiAqIGFuIEFzeW5jSXRlcmF0b3Igc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVcbiAqIEdldCBhIG5ldyBzdWJzY3JpcHRpb24gd2hvc2Ugc3RhcnRpbmcgcG9zaXRpb24gaXMgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnRcbiAqIHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN1YnNjcmlwdGlvblJlY29yZDxUPlxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGljYXRpb25cbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAndW5zZXJpYWxpemUnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICovXG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3MgU0RLLlxuICpcbiAqIFZzdG9yYWdlIGlzIGEgaGllcmFyY2hpY2FsIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JhZ2Ugc3RydWN0dXJlIHRoYXRcbiAqIGlkZW50aWZpZXMgY2hpbGRyZW4gYnkgcmVzdHJpY3RlZCBBU0NJSSBuYW1lIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYXJiaXRyYXJ5XG4gKiBzdHJpbmctdmFsdWVkIGRhdGEgZm9yIGVhY2ggbm9kZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JhZ2VOb2RlXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBzdHJpbmcpID0+IHZvaWR9IHNldFZhbHVlIHB1Ymxpc2hlcyBzb21lIGRhdGFcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IGdldCB0aGVcbiAqIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JlIGtleSBmb3IgdGhpcyBzdG9yYWdlIGl0ZW1cbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdGg6IHN0cmluZywgb3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IGdldCB0aGUgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmUga2V5XG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmlwdGlvbjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaWJlcjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpYmVyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1tYqM5UBAACVAQAAIAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEGauoGCIAABgiAAAhAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4va2V5cy9jaGVja0tleS5qcyIsIi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4va2V5cy9jb3B5QmFnLmpzIiwiLi9rZXlzL2NvcHlTZXQuanMiLCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4va2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIiwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsIi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qcyIsIi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJNIiwiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5UGF0dGVybiIsImFzc2VydFBhdHRlcm4iLCJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiIsImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvRWxlbWVudHMiLCJjb21wYXJlS2V5cyIsImNvbXBhcmVSYW5rIiwiZGVmYXVsdCIsImRlZmVuZFByb3RvdHlwZSIsImRlZmluZUhlYXBGYXJDbGFzcyIsImRlZmluZUhlYXBGYXJDbGFzc0tpdCIsImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsImZpdCIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5U2V0S2V5cyIsImdldFJhbmtDb3ZlciIsImluaXRFbXB0eSIsImlzRW5jb2RlZFJlbW90YWJsZSIsImlzS2V5IiwiaXNQYXR0ZXJuIiwiaXNSYW5rU29ydGVkIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlSGVhcEZhckluc3RhbmNlIiwibWFrZUxlZ2FjeU1hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIiwibWFrZVNjYWxhck1hcCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmUiLCJtYWtlV2Vha1N0b3JlIiwibWF0Y2hlcyIsInByb3ZpZGVMYXp5Iiwic2V0Q29tcGFyZSIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiIsInNvcnRCeVJhbmsiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJpc0tleVwiLCBbJGjigI1fbGl2ZVtcImlzS2V5XCJdXV0sW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0S2V5XCJdXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQ29weVNldFwiXV1dLFtcImdldENvcHlTZXRLZXlzXCIsIFskaOKAjV9saXZlW1wiZ2V0Q29weVNldEtleXNcIl1dXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnXCJdXV0sW1wibWFrZUNvcHlCYWdGcm9tRWxlbWVudHNcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiXV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9saXZlW1wiZ2V0Q29weUJhZ0VudHJpZXNcIl1dXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5TWFwXCJdXV0sW1wiZ2V0Q29weU1hcEVudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5TWFwRW50cmllc1wiXV1dXV0sW1wiLi9rZXlzL2NvcHlTZXQuanNcIiwgW1tcImNvZXJjZVRvRWxlbWVudHNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0VsZW1lbnRzXCJdXV1dXSxbXCIuL2tleXMvY29weUJhZy5qc1wiLCBbW1wiY29lcmNlVG9CYWdFbnRyaWVzXCIsIFskaOKAjV9saXZlW1wiY29lcmNlVG9CYWdFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImNvbXBhcmVLZXlzXCIsIFskaOKAjV9saXZlW1wiY29tcGFyZUtleXNcIl1dXSxbXCJrZXlMVFwiLCBbJGjigI1fbGl2ZVtcImtleUxUXCJdXV0sW1wia2V5TFRFXCIsIFskaOKAjV9saXZlW1wia2V5TFRFXCJdXV0sW1wia2V5RVFcIiwgWyRo4oCNX2xpdmVbXCJrZXlFUVwiXV1dLFtcImtleUdURVwiLCBbJGjigI1fbGl2ZVtcImtleUdURVwiXV1dLFtcImtleUdUXCIsIFskaOKAjV9saXZlW1wia2V5R1RcIl1dXV1dLFtcIi4va2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0lzU3VwZXJzZXRcIl1dXSxbXCJlbGVtZW50c0lzRGlzam9pbnRcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0lzRGlzam9pbnRcIl1dXSxbXCJlbGVtZW50c0NvbXBhcmVcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0NvbXBhcmVcIl1dXSxbXCJlbGVtZW50c1VuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNVbmlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiXV1dLFtcImVsZW1lbnRzSW50ZXJzZWN0aW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIl1dXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIl1dXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9saXZlW1wic2V0SXNTdXBlcnNldFwiXV1dLFtcInNldElzRGlzam9pbnRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc0Rpc2pvaW50XCJdXV0sW1wic2V0Q29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcInNldENvbXBhcmVcIl1dXSxbXCJzZXRVbmlvblwiLCBbJGjigI1fbGl2ZVtcInNldFVuaW9uXCJdXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLCBbJGjigI1fbGl2ZVtcInNldERpc2pvaW50VW5pb25cIl1dXSxbXCJzZXRJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJzZXRJbnRlcnNlY3Rpb25cIl1dXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW1tcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2xpdmVbXCJiYWdJc1N1cGVyYmFnXCJdXV0sW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImJhZ0NvbXBhcmVcIl1dXSxbXCJiYWdVbmlvblwiLCBbJGjigI1fbGl2ZVtcImJhZ1VuaW9uXCJdXV0sW1wiYmFnSW50ZXJzZWN0aW9uXCIsIFskaOKAjV9saXZlW1wiYmFnSW50ZXJzZWN0aW9uXCJdXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIl1dXV1dLFtcIi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJNXCIsIFskaOKAjV9saXZlW1wiTVwiXV1dLFtcImdldFJhbmtDb3ZlclwiLCBbJGjigI1fbGl2ZVtcImdldFJhbmtDb3ZlclwiXV1dLFtcImlzUGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImlzUGF0dGVyblwiXV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0S2V5UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydEtleVBhdHRlcm5cIl1dXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9saXZlW1wibWF0Y2hlc1wiXV1dLFtcImZpdFwiLCBbJGjigI1fbGl2ZVtcImZpdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLCBbJGjigI1fbGl2ZVtcImRlZmVuZFByb3RvdHlwZVwiXV1dLFtcImluaXRFbXB0eVwiLCBbJGjigI1fbGl2ZVtcImluaXRFbXB0eVwiXV1dLFtcImRlZmluZUhlYXBGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUhlYXBGYXJDbGFzc1wiXV1dLFtcImRlZmluZUhlYXBGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUhlYXBGYXJDbGFzc0tpdFwiXV1dLFtcIm1ha2VIZWFwRmFySW5zdGFuY2VcIiwgWyRo4oCNX2xpdmVbXCJtYWtlSGVhcEZhckluc3RhbmNlXCJdXV1dXSxbXCIuL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlUmFua1wiXV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fbGl2ZVtcImlzUmFua1NvcnRlZFwiXV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2xpdmVbXCJzb3J0QnlSYW5rXCJdXV1dXSxbXCIuL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJtYWtlRGVjb2RlUGFzc2FibGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlRGVjb2RlUGFzc2FibGVcIl1dXSxbXCJtYWtlRW5jb2RlUGFzc2FibGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlRW5jb2RlUGFzc2FibGVcIl1dXSxbXCJpc0VuY29kZWRSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJpc0VuY29kZWRSZW1vdGFibGVcIl1dXSxbXCJ6ZXJvUGFkXCIsIFskaOKAjV9saXZlW1wiemVyb1BhZFwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXSwkaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXSwkaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXSwkaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl1dXV1dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVMYXp5XCJdXV1dXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lNYXBcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTGVnYWN5TWFwXCJdLCRo4oCNX2xpdmVbXCJtYWtlTGVnYWN5TWFwXCJdXV1dXSxbXCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzXCIsIFtbXCJtYWtlTGVnYWN5V2Vha01hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lXZWFrTWFwXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImlzS2V5IjpbImlzS2V5IixmYWxzZV0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiLGZhbHNlXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiLGZhbHNlXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiLGZhbHNlXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciLGZhbHNlXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLGZhbHNlXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiLGZhbHNlXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiLGZhbHNlXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiLGZhbHNlXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIixmYWxzZV0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiLGZhbHNlXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiLGZhbHNlXSwia2V5TFQiOlsia2V5TFQiLGZhbHNlXSwia2V5TFRFIjpbImtleUxURSIsZmFsc2VdLCJrZXlFUSI6WyJrZXlFUSIsZmFsc2VdLCJrZXlHVEUiOlsia2V5R1RFIixmYWxzZV0sImtleUdUIjpbImtleUdUIixmYWxzZV0sImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiLGZhbHNlXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCIsZmFsc2VdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIixmYWxzZV0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiIsZmFsc2VdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIixmYWxzZV0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0IixmYWxzZV0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCIsZmFsc2VdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiLGZhbHNlXSwic2V0VW5pb24iOlsic2V0VW5pb24iLGZhbHNlXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIixmYWxzZV0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iLGZhbHNlXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0IixmYWxzZV0sImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyIsZmFsc2VdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiLGZhbHNlXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iLGZhbHNlXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiIsZmFsc2VdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiTSI6WyJNIixmYWxzZV0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiLGZhbHNlXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiIsZmFsc2VdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iLGZhbHNlXSwiYXNzZXJ0S2V5UGF0dGVybiI6WyJhc3NlcnRLZXlQYXR0ZXJuIixmYWxzZV0sIm1hdGNoZXMiOlsibWF0Y2hlcyIsZmFsc2VdLCJmaXQiOlsiZml0IixmYWxzZV0sImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiLGZhbHNlXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSIsZmFsc2VdLCJkZWZpbmVIZWFwRmFyQ2xhc3MiOlsiZGVmaW5lSGVhcEZhckNsYXNzIixmYWxzZV0sImRlZmluZUhlYXBGYXJDbGFzc0tpdCI6WyJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiLGZhbHNlXSwibWFrZUhlYXBGYXJJbnN0YW5jZSI6WyJtYWtlSGVhcEZhckluc3RhbmNlIixmYWxzZV0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIixmYWxzZV0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiLGZhbHNlXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIixmYWxzZV0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiLGZhbHNlXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSIsZmFsc2VdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIixmYWxzZV0sInplcm9QYWQiOlsiemVyb1BhZCIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXAiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlV2Vha1N0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5IixmYWxzZV0sIm1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCIsZmFsc2VdLCJkZWZhdWx0IjpbIm1ha2VMZWdhY3lNYXAiLGZhbHNlXSwibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIQT5lIJDAACCQwAAKQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY29weUJhZy5qcyIsIi4vY29weVNldC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFByaW1pdGl2ZUtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsYXNzZXJ0UGFzc2FibGUsRmFyLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGlkZW50Q2hlY2tlcixjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJjaGVja0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjaGVja0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJjaGVja0JhZ0VudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gUHJpbWl0aXZlIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQcmltaXRpdmVLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzT2JqZWN0KHZhbCkpe1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YCkpO1xuXG4gfVxuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzUHJpbWl0aXZlS2V5KGlzUHJpbWl0aXZlS2V5KTtcbmhhcmRlbihpc1ByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbmNvbnN0ICAgICAgICBpc1NjYWxhcktleT0odmFsKT0+Y2hlY2tTY2FsYXJLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbmNvbnN0IGtleU1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbi8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlTZXQ8S2V5Pj4gKi9cbmNvbnN0IGNvcHlTZXRNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlTZXQ9KHMsY2hlY2spPT57XG5pZihjb3B5U2V0TWVtby5oYXMocykpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKHMpPT09J3RhZ2dlZCcmJmdldFRhZyhzKT09PSdjb3B5U2V0J3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpJiZcbmNoZWNrRWxlbWVudHMocy5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShzLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlTZXRNZW1vLmFkZChzKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXQ8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weVNldH0gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5jaGVja0NvcHlTZXQocyxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5oYXJkZW4oaXNDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge2Fzc2VydHMgcyBpcyBDb3B5U2V0PEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlTZXQ9KHMpPT57XG5jaGVja0NvcHlTZXQocyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weVNldEtleXM9KHMpPT57XG5hc3NlcnRDb3B5U2V0KHMpO1xucmV0dXJuIHMucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weVNldEtleT0ocyxmbik9PlxuZ2V0Q29weVNldEtleXMocykuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlTZXQ9KGVsZW1lbnRJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRJdGVyKTtcbmFzc2VydENvcHlTZXQocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5QmFnPEtleT4+ICovXG5jb25zdCBjb3B5QmFnTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5QmFnPShiLGNoZWNrKT0+e1xuaWYoY29weUJhZ01lbW8uaGFzKGIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihiKT09PSd0YWdnZWQnJiZnZXRUYWcoYik9PT0nY29weUJhZyd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weUJhZzogJHtifWApKSYmXG5jaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShiLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlCYWdNZW1vLmFkZChiKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtiIGlzIENvcHlCYWc8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWc9KGIpPT5jaGVja0NvcHlCYWcoYixpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnPEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5QmFnfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlCYWc9KGIpPT57XG5jaGVja0NvcHlCYWcoYixhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPlsncGF5bG9hZCddfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weUJhZ0VudHJpZXM9KGIpPT57XG5hc3NlcnRDb3B5QmFnKGIpO1xucmV0dXJuIGIucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weUJhZ0VudHJpZXMoZ2V0Q29weUJhZ0VudHJpZXMpO1xuaGFyZGVuKGdldENvcHlCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcGFyYW0geyhlbnRyeTogW0ssIGJpZ2ludF0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weUJhZ0VudHJ5PShiLGZuKT0+XG5nZXRDb3B5QmFnRW50cmllcyhiKS5ldmVyeSgoZW50cnksaW5kZXgpPT5mbihlbnRyeSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5QmFnRW50cnkoZXZlcnlDb3B5QmFnRW50cnkpO1xuaGFyZGVuKGV2ZXJ5Q29weUJhZ0VudHJ5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnPShiYWdFbnRyeUl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZUJhZ09mRW50cmllcyhiYWdFbnRyeUl0ZXIpO1xuYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWdGcm9tRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5jb25zdCBzb3J0ZWQ9c29ydEJ5UmFuayhlbGVtZW50SXRlcixmdWxsQ29tcGFyZSk7XG4vKiogQHR5cGUge1tLLGJpZ2ludF1bXX0gKi9cbmNvbnN0IGVudHJpZXM9W107XG5mb3IobGV0IGk9MDtpPHNvcnRlZC5sZW5ndGg7KXtcbmNvbnN0IGs9c29ydGVkW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxzb3J0ZWQubGVuZ3RoJiZmdWxsQ29tcGFyZShrLHNvcnRlZFtqXSk9PT0wKXtcbmorPTE7XG4gfVxuZW50cmllcy5wdXNoKFtrLEJpZ0ludChqLWkpXSk7XG5pPWo7XG4gfVxucmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlNYXAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weU1hcCdzIGtleXMgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlNYXA8YW55LGFueT4+ICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlNYXB9ICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlNYXB9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEtleXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcFZhbHVlcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PWtleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBLZXk9KG0sZm4pPT5cbmdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KHZhbHVlOiBWLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZT0obSxmbik9PlxuZ2V0Q29weU1hcFZhbHVlcyhtKS5ldmVyeSgodmFsdWUsaW5kZXgpPT5mbih2YWx1ZSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5TWFwS2V5U2V0PShtKT0+XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaOKAjV9vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbi8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbi8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuLyogVE9ETyBUaGlzKi9cbi8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbi8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuY29uc3Qgc29ydGVkRW50cmllcz1zb3J0QnlSYW5rKGVudHJpZXMsY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0IGtleXM9c29ydGVkRW50cmllcy5tYXAoKFtrLF92XSk9PmspO1xuY29uc3QgdmFsdWVzPXNvcnRlZEVudHJpZXMubWFwKChbX2ssdl0pPT52KTtcbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdjb3B5TWFwJyx7a2V5cyx2YWx1ZXN9KTtcbmFzc2VydENvcHlNYXAocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbi8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbi8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBBbGwgcmVtb3RhYmxlcyBhcmUga2V5cy4qL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJpbWl0aXZlS2V5IjpbImlzUHJpbWl0aXZlS2V5Il0sImFzc2VydFByaW1pdGl2ZUtleSI6WyJhc3NlcnRQcmltaXRpdmVLZXkiXSwiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADRody3KGgAAyhoAACwAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY2hlY2tLZXkuanMiLCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxhc3NlcnRLZXksYmFnQ29tcGFyZSxzZXRDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9hID0+IChiYWdDb21wYXJlID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbW1wic2V0Q29tcGFyZVwiLCBbJGjigI1fYSA9PiAoc2V0Q29tcGFyZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge0tleUNvbXBhcmV9ICovXG5jb25zdCAgICAgICAgY29tcGFyZUtleXM9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRLZXkobGVmdCk7XG5hc3NlcnRLZXkocmlnaHQpO1xuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbi8qIERpZmZlcmVudCBwYXNzU3R5bGVzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6e1xuLyogZm9yIHRoZXNlLCBrZXlzIGNvbXBhcmUgdGhlIHNhbWUgYXMgcmFuayovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdudW1iZXInOntcbmNvbnN0IHJhbmtDb21wPWNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuaWYocmFua0NvbXA9PT0wKXtcbnJldHVybiAwO1xuIH1cbmlmKE51bWJlci5pc05hTihsZWZ0KXx8TnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG4vKiBOYU4gaXMgZXF1YWwgdG8gaXRzZWxmLCBidXQgaW5jb21tZW5zdXJhdGUgd2l0aCBldmVyeXRoaW5nIGVsc2UqL1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCl8fCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiBOYU47XG4gfVxuLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbi8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xucmV0dXJuIHJhbmtDb21wO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5pZihsZWZ0PT09cmlnaHQpe1xucmV0dXJuIDA7XG4gfVxuLyogSWYgdHdvIHJlbW90YWJsZXMgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gYXMga2V5cyB0aGV5IGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4qL1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBrZXkgb3JkZXIuIFJhbmsgb3JkZXIgb2YgYXJyYXlzIGlzIGxleGljb2dyYXBoaWMgYnkqL1xuLyogcmFuayBvcmRlci4qL1xuLyogQmVjYXVzZSB0aGUgaW52YXJpYW50cyBhYm92ZSBhcHBseSB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LCovXG4vKiB0aGV5IGFwcGx5IHRvIHRoZSBhcnJheSBhcyBhIHdob2xlLiovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmVLZXlzKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFrZXlFUShsZWZ0TmFtZXMscmlnaHROYW1lcykpe1xuLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbi8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4vKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4vKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4vKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xucmV0dXJuIE5hTjtcbiB9XG5jb25zdCBsZWZ0VmFsdWVzPXJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyk7XG5jb25zdCByaWdodFZhbHVlcz1yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcyk7XG4vKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4vKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xubGV0IHJlc3VsdD0wO1xuZm9yKGxldCBpPTA7aTxsZWZ0VmFsdWVzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXA9Y29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSxyaWdodFZhbHVlc1tpXSk7XG5pZihOdW1iZXIuaXNOYU4oY29tcCkpe1xucmV0dXJuIE5hTjtcbiB9XG5pZihyZXN1bHQhPT1jb21wJiZjb21wIT09MCl7XG5pZihyZXN1bHQ9PT0wKXtcbnJlc3VsdD1jb21wO1xuIH1lbHNle1xuYXNzZXJ0KFxucmVzdWx0PT09LTEmJmNvbXA9PT0xfHxyZXN1bHQ9PT0xJiZjb21wPT09LTEpO1xuXG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4gfVxuLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbi8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbi8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4vKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4vKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuLyogcHJvcGVydHkgbmFtZXMuKi9cbi8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG5jb25zdCByaWdodFRhZz1nZXRUYWcocmlnaHQpO1xuaWYobGVmdFRhZyE9PXJpZ2h0VGFnKXtcbi8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0VGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogY29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5U2V0IFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogaXMga2V5RVEgdG8gc29tZSBlbGVtZW50IG9mIFkgYW5kIHNvbWUgZWxlbWVudCBvZiBZIGlzKi9cbi8qIG5vdCBrZXlFUSB0byBhbnkgZWxlbWVudCBvZiBYLiovXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8qIGNvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gY29weUJhZyBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIG9jY3VycyBubyBtb3JlIHRoYW4gdGhlIGtleUVRIGVsZW1lbnQgb2YgWSwgYW5kIHNvbWUgZWxlbWVudCovXG4vKiBvZiBZIG9jY3VycyBtb3JlIHRoYW4gc29tZSBlbGVtZW50IG9mIFgsIHdoZXJlIGJlaW5nIGFic2VudCovXG4vKiBmcm9tIFggY291bnRzIGFzIG9jY3VycmluZyB6ZXJvIHRpbWVzLiovXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFR3byBjb3B5TWFwcyB0aGF0IGhhdmUgZGlmZmVyZW50IGtleXMgKGFjY29yZGluZyB0byBrZXlFUSkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiBUaGUgcmVwcmVzZW50YXRpb24gb2YgY29weU1hcHMgaW5jbHVkZXMgdGhlIGtleXMqL1xuLyogZmlyc3QsIGluIHRoZSBzYW1lIHJldmVyc2UgcmFuayBvcmRlciB1c2VkIGJ5IHNldHMuIFRodXMsIGFsbCovXG4vKiBjb3B5TWFwcyB3aXRoIGtleXMgb2YgdGhlIHNhbWUgcmFuayAod2hpY2ggaXMqL1xuLyogbGVzcyBwcmVjaXNlISkgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyIHdoZW4gY29weU1hcHMgYXJlIHNvcnRlZCovXG4vKiBieSByYW5rLCBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YgbWlzc2VzIHdoZW4gcmFuZ2Ugc2VhcmNoaW5nLiovXG4vKiovXG4vKiBBbW9uZyBjb3B5TWFwcyB3aXRoIHRoZSBzYW1lIGtleXMgKGFjY29yZGluZyB0byBrZXlFUSksIHRoZXkqL1xuLyogY29tcGFyZSBieSBhIGNvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvZiB0aGVpciB2YWx1ZXMuIFRodXMsIGFzKi9cbi8qIHdpdGggcmVjb3JkcywgZm9yIHR3byBjb3B5TWFwcyBYIGFuZCBZLCBpZiBgY29tcGFyZUtleXMoWCxZKSA8Ki9cbi8qIDBgIHRoZW4sIGJlY2F1c2UgdGhlc2UgdmFsdWVzIG9iZXkgdGhlIGFib3ZlIGludmFyaWFudHMsIG5vbmUgb2YqL1xuLyogdGhlIHZhbHVlcyBpbiBYIGhhdmUgYSBsYXRlciByYW5rIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUqL1xuLyogb2YgWS4gVGh1cywgYGNvbXBhcmVSYW5rKFgsWSkgPD0gMGAuIFRPRE8gaW1wbGVtZW50Ki9cbnRocm93IEZhaWwgYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbmNvbnN0ICAgICAgICBrZXlMVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPDA7JGjigI1fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjigI1fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG5jb25zdCAgICAgICAga2V5RVE9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT09PTA7JGjigI1fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG5jb25zdCAgICAgICAga2V5R1RFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+PTA7JGjigI1fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRo4oCNX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATIvipA4TAAAOEwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHlcbiAqIGtub3duIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0XG4gKiByYXRoZXIgdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZVxuICogYXJyYXkgZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUta2V5cyBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4vKiBTaW5jZSB0aGUga2V5IGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB0aGUgdmFsdWUgKHRoZSBjb3VudCksKi9cbi8qIHNvcnRpbmcgYnkgZnVsbE9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBkdXBsaWNhdGUga2V5cyovXG4vKiBhZGphY2VudCBpbmRlcGVuZGVudCBvZiB0aGVpciBjb3VudHMuKi9cbmJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9YmFnRW50cmllc1tpLTFdWzBdO1xuY29uc3QgazE9YmFnRW50cmllc1tpXVswXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmU9fSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuY29uc3QgICAgICAgIGNoZWNrQmFnRW50cmllcz0oYmFnRW50cmllcyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5mb3IoY29uc3QgZW50cnkgb2YgYmFnRW50cmllcyl7XG5pZihcbnBhc3NTdHlsZU9mKGVudHJ5KSE9PSdjb3B5QXJyYXknfHxcbmVudHJ5Lmxlbmd0aCE9PTJ8fFxudHlwZW9mIGVudHJ5WzFdIT09J2JpZ2ludCcpXG57XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG5pZihlbnRyeVsxXTwxKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayAtLSBkb2Vzbid0IHVuZGVyc3RhbmQgYXNzZXJ0cyovXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHJldHVybnMge2Fzc2VydHMgYmFnRW50cmllcyBpcyBbUGFzc2FibGUsYmlnaW50XVtdfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0QmFnRW50cmllcz0oYmFnRW50cmllcyk9PntcbmNoZWNrQmFnRW50cmllcyhiYWdFbnRyaWVzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9CYWdFbnRyaWVzPShiYWdFbnRyaWVzTGlzdCk9PntcbmNvbnN0IGJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbnJldHVybiBiYWdFbnRyaWVzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VCYWdPZkVudHJpZXM9KGJhZ0VudHJ5SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weUJhZycsY29lcmNlVG9CYWdFbnRyaWVzKGJhZ0VudHJ5SXRlcikpOyRo4oCNX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI6EjZOHDwAAhw8AACgAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IGtub3duXG4gKiB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdCByYXRoZXJcbiAqIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmUgYXJyYXlcbiAqIGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5lbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWVsZW1lbnRzW2ktMV07XG5jb25zdCBrMT1lbGVtZW50c1tpXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGVzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmU9fSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABLdXk4GiIAABoiAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgcmF0aGVyIHRoYW4qL1xuLyogZHVwbGljYXRpbmcgd2l0aCBjaGFuZ2VzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydD0oYmFnRW50cmllcyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IGVudHJ5PWJhZ0VudHJpZXNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShcbmo8bGVuZ3RoJiZcbnJhbmtDb21wYXJlKGVudHJ5WzBdLGJhZ0VudHJpZXNbal1bMF0pPT09MClcbntcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOmVudHJ5fSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1iYWdFbnRyaWVzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6W251bGwsMG5dfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9YmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz1iYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4YztcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHljO1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnhEb25lLFxudmFsdWU6W3gseGNdfT1cbnhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eURvbmUsXG52YWx1ZTpbeSx5Y119PVxueWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCx4Yyx5Y107XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZz0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc0Rpc2pvaW50IGFzIHdlbGwuKi9cbi8qIFRoZSBjb2RlIGlzIGlkZW50aWNhbC4qL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVyQ29tcGFyZSBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuY29uc3QgYmFnSXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHhjPnljKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuY29uc3QgYmFnSXRlclVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xucmVzdWx0LnB1c2goW20seGMreWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yzw9eWM/eGM6eWM7XG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yy15Yztcbm1jPj0wbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZihtYz49MW4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGJhZ0l0ZXJPcCk9Pih4YmFnRW50cmllcyx5YmFnRW50cmllcyk9PlxuYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKSk7XG5cbmNvbnN0IGJhZ0VudHJpZXNJc1N1cGVyYmFnPW1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50PW1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNDb21wYXJlPW1lcmdlaWZ5KGJhZ0l0ZXJDb21wYXJlKTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbj1tZXJnZWlmeShiYWdJdGVyVW5pb24pO1xuY29uc3QgYmFnRW50cmllc0ludGVyc2VjdGlvbj1tZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5iYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxubWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgYmFnSXNTdXBlcmJhZz1yYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRo4oCNX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbmNvbnN0ICAgICAgICBiYWdJc0Rpc2pvaW50PXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNEaXNqb2ludCk7JGjigI1fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGJhZ0NvbXBhcmU9cmF3QmFnaWZ5KGJhZ0VudHJpZXNDb21wYXJlKTskaOKAjV9vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5jb25zdCAgICAgICAgYmFnVW5pb249YmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjigI1fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG5jb25zdCAgICAgICAgYmFnSW50ZXJzZWN0aW9uPWJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGJhZ0Rpc2pvaW50U3VidHJhY3Q9YmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlMrdq60lAACtJQAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jb3B5U2V0LmpzIl0sImV4cG9ydHMiOlsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwic2V0Q29tcGFyZSIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaOKAjV9pbXBvcnRzKFtbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgZWxlbWVudHNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmUgdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgZWxlbWVudHMgdGllZCBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGVsZW1lbnRzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgZWxlbWVudHNgIGFycmF5IGFjY29yZGluZ1xuICogIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCB3aW5kb3dSZXNvcnQ9KGVsZW1lbnRzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCB2YWx1ZT1lbGVtZW50c1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8bGVuZ3RoJiZyYW5rQ29tcGFyZSh2YWx1ZSxlbGVtZW50c1tqXSk9PT0wKXtcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1lbGVtZW50cy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOm51bGx9KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSB4ZWxlbWVudHNcbiAqIEBwYXJhbSB7VFtdfSB5ZWxlbWVudHNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4ZWxlbWVudHMseWVsZW1lbnRzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9d2luZG93UmVzb3J0KHhlbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9d2luZG93UmVzb3J0KHllbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2UgZm91ciBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7ZG9uZTp4RG9uZSx2YWx1ZTp4fT14aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7ZG9uZTp5RG9uZSx2YWx1ZTp5fT15aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LDFuLDFuXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLF95Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuY29uc3QgaXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbmNvbnN0IGl0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4vKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM9PT0wbnx8eWM9PT0wbnx8RmFpbCBgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG5pZih4Yz49MW4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MW58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz49MW58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYoeWM9PT0wbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGl0ZXJPcCk9Pih4ZWxlbWVudHMseWVsZW1lbnRzKT0+XG5pdGVyT3AobWVyZ2UoeGVsZW1lbnRzLHllbGVtZW50cykpO1xuXG5jb25zdCAgICAgICAgZWxlbWVudHNJc1N1cGVyc2V0PW1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjigI1fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRo4oCNX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG5jb25zdCAgICAgICAgZWxlbWVudHNVbmlvbj1tZXJnZWlmeShpdGVyVW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjigI1fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjigI1fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjigI1fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9cmF3U2V0aWZ5KGVsZW1lbnRzQ29tcGFyZSk7JGjigI1fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuY29uc3QgICAgICAgIHNldFVuaW9uPXNldGlmeShlbGVtZW50c1VuaW9uKTskaOKAjV9vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50U3VidHJhY3Q9c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgYW5kIGl0cyBmcmF0ZXJuYWwgc2libGluZyBsZWdhY3lXZWFrTWFwIGV4aXN0IG9ubHkgdG9cbiAqIGVhc2UgYSB0cmFuc2l0aW9uIHRvIHRoZSBtb2Rlcm4gYHN0b3JlYCBzeXN0ZW0sIGFyZSBkZXByZWNhdGVkLFxuICogYW5kIHdpbGwgZXZlbnR1YWxseSBkaXNhcHBlYXIuIFRoZXkgYXJlIG5lZWRlZCBmb3Igbm93IHRvIHN1cHBvcnRcbiAqIHNvbWUgb2YgdGhlIHVzZXMgb2YgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoXG4gKiB0aGUgbmV3LiBUaGUgY29uc3RyYWludCBpbXBvc2VkIGJ5IHRoZSBuZXcgaXMgdGhhdCBvbmx5IHBhc3NhYmxlcyBjYW5cbiAqIGJlIHVzZWQgYXMgdmFsdWVzLCBhbmQgb25seSBrZXlzIChyb3VnaGx5LCBzdHJ1Y3R1cmVzLCBha2EgY29tcGFyYWJsZXMpXG4gKiBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzM1NjdcbiAqIFRPRE8gT25jZSB0aGF0IFBSIGlzIG1lcmdlZCwgbGluayB0byB0aGUgZG9jdW1lbnRzIHJhdGhlciB0aGFuIHRoZSBQUnMuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBub24tY29uZm9ybWluZyB1c2VzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCBhXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICogY29tbWVudCBleHBsYWluaW5nIHRoZSBwcm9ibGVtIGluaGliaXRpbmcgY29udmVyc2lvbiB0byB0aGUgbmV3XG4gKiBzeXN0ZW0uIFNvbWUgb2YgdGhlc2UgcHJvYmxlbXMgYXMgb2YgdGhpcyB3cml0aW5nOlxuICogICAgKiBBIHByb21pc2VLaXQgdXNlZCBhcyBhIHZhbHVlLCBldmVuIHRob3VnaCBhIHByb21pc2VLaXQgaXMgbm90XG4gKiAgICAgIGEgcGFzc2FibGUuIFNvbHV0aW9ucyBhcmUgdG8gbWFrZSBpdCBhIHBhc3NhYmxlLCBvciB0byBjb252ZXJ0XG4gKiAgICAgIHRoZSBjb250YWluZXIgYmFjayB0byBhIGNvbnZlbnRpb25hbCBKYXZhU2NyaXB0IE1hcC5cbiAqICAgICogQSBtdXRhYmxlIGFycmF5IHVzZWQgYXMgYSB2YWx1ZSwgdGhhdCBpcyBzdWJzZXF1ZW50bHkgbXV0YXRlZC5cbiAqICAgICAgRnJlZXppbmcgdGhlIGFycmF5IHdvdWxkbid0IHdvcmsgb2YgY291cnNlIGJlY2F1c2UgaXQgd291bGQgYnJlYWtcbiAqICAgICAgdGhlIHN1YnNlcXVlbnQgbXV0YXRpb24uIFVzaW5nIGEgZmFyIG9iamVjdCB3cmFwcGluZyBhbiBhcnJheSB3b3VsZFxuICogICAgICBsaWtlbHkgd29yayBmaW5lLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJNYXAgaWYgcG9zc2libGUsIE1hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5TWFwPSh0YWc9J2tleScpPT57XG5jb25zdCBtPW5ldyBNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hbS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5tLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABay5YGrQYAAK0GAAAwAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuLyoqXG4gKiBTZWUgZG9jY29tbWVudCBpbiB0aGUgY2xvc2VseSByZWxhdGVkIGBsZWdhY3lNYXAuanNgIG1vZHVsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyV2Vha01hcCBpZiBwb3NzaWJsZSwgV2Vha01hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5V2Vha01hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIXdtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbndtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gd20uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi93bS5nZXQoa2V5KSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLmRlbGV0ZShrZXkpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5V2Vha01hcChtYWtlTGVnYWN5V2Vha01hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeVdlYWtNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKD8gCrSQAAA0kAAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL2hlbHBlcnMvZXJyb3IuanMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLGFzc2VydFJlY29yZCxnZXRUYWcsbWFrZVRhZ2dlZCxFcnJvckhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvaW50ZXJuYWwnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZE5hbWVzPShyZWNvcmQpPT5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4vKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4vKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbmhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaOKAjV9vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fEZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qIEphdmFTY3JpcHQgYmlnaW50cyBhcmUgZW5jb2RlZCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuKi9cbi8qIGluaXRpYWwgY29tcG9uZW50IGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdCBjb3VudCBhcyBhIHVuYXJ5IHN0cmluZywgYSovXG4vKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGUqL1xuLyogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uKi9cbi8qIFRvIGVuc3VyZSB0aGF0IHRoZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgb2YgZW5jb2RlZCB2YWx1ZXMgbWF0Y2hlcyB0aGUqL1xuLyogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeSovXG4vKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YqL1xuLyogXCIjXCJzIFt3aGljaCBzb3J0IGJlZm9yZSBkZWNpbWFsIGRpZ2l0c10pIHZzLiBwb3NpdGl2ZSBhbmQgemVybyB2YWx1ZXMgKHR5cGUqL1xuLyogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmQqL1xuLyogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0cyovXG4vKiB0ZW4ncyBjb21wbGVtZW50IChzbyB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBvZiB0aGUgc2FtZSBzY2FsZSBzb3J0IGJ5Ki9cbi8qICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8RmFpbCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8RmFpbCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKDEpO1xucmVtLmxlbmd0aD09PW5EaWdpdHN8fFxuRmFpbCBgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gO1xuZWxlbUNoYXJzLnB1c2goYzIpO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuIH1cbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxGYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCcoJykpO1xuY29uc3Qga2V5c3ZhbHM9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xua2V5c3ZhbHMubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEAgdHMtaWdub3JlKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5lbmNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbnt9KT0+e1xuY29uc3QgZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCdyJyl8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnIScpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2UocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJz8nKXx8XG5GYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gYHkke25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfVxuICovXG4vKiBgeWFybiBsaW50YCBjb21wbGFpbnMgaGVyZSBidXQgbm90IGZvciBlcXVpdmFsZW50IGNvZGUgaW4gYWdvcmljLXNkay4qL1xuLyogQWxzbywgdnNjb2RlIGRvZXMgbm90IGNvbXBsYWluLiBIZW5jZSB3ZSdyZSB1c2luZyBhdC10cy1pZ25vcmUgcmF0aGVyIHRoYW4qL1xuLyogYXQtdHMtZXhwZWN0LWVycm9yLiBVc2luZyBhdC10cy1pZ25vcmUgc2hvdWxkIGFsc28gZ2VuZXJhdGUgYSBjb21wbGFpbnQqL1xuLyogdGhhdCB3ZSBzaG91bGQgYmUgdXNpbmcgYXQtZXhwZWN0LWVycm9yLCB3aGVyZSB3ZSB3b3VsZCBub3JtYWxseSBuZWVkKi9cbi8qIHRvIHN1cHByZXNzIHRoYXQgZXJyb3IgYXMgd2VsbC4gSG93ZXZlciwgcGVyaGFwcyB0aGF0IHNlY29uZCBlcnJvciBjdXJyZW50bHkqL1xuLyogaGFwcGVucyBvbmx5IGluIGFnb3JpYy1zZGssIGJ1dCBub3QgeWV0IGluIGVuZG8uIFRPRE8gZmlndXJlIG91dCBhbmQgZml4LiovXG4vKiBAIHRzLWlnbm9yZSovXG5jb25zdCAgICAgICAgbWFrZURlY29kZVBhc3NhYmxlPSh7XG5kZWNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5kZWNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZGVjb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG57fSk9PntcbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KDApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQpO1xuIH1cbmNhc2Uncyc6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpO1xuIH1cbmNhc2UnYic6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpIT09J2ZhbHNlJztcbiB9XG5jYXNlJ24nOlxuY2FzZSdwJzp7XG5yZXR1cm4gZGVjb2RlQmlnSW50KGVuY29kZWQpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnISc6e1xucmV0dXJuIGRlY29kZUVycm9yKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UneSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGVkLnN1YnN0cmluZygxKSk7XG4gfVxuY2FzZSdbJzp7XG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2VuY29kZWR9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFua09yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9aGFyZGVuKHtcbl9fcHJvdG9fXzpudWxsLFxuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9KTskaOKAjV9vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACRpMmBOi4AADouAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc3siaW1wb3J0cyI6WyIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmluZUhlYXBGYXJDbGFzcyIsImRlZmluZUhlYXBGYXJDbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VIZWFwRmFySW5zdGFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLEUsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLGZpdCxNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzLHNlYWwsZnJlZXplfT1PYmplY3Q7XG5cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShhcmdzLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdCBwYXJhbXNQYXR0ZXJuPU0uc3BsaXRBcnJheShcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkKTtcblxuZml0KGhhcmRlbihhcmdzKSxwYXJhbXNQYXR0ZXJuLGxhYmVsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHtNZXRob2R9XG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e3N5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuc3luY01ldGhvZCguLi5hcmdzKXtcbmRlZmVuZFN5bmNBcmdzKGhhcmRlbihhcmdzKSxtZXRob2RHdWFyZCxsYWJlbCk7XG5jb25zdCByZXN1bHQ9YXBwbHkobWV0aG9kLHRoaXMsYXJncyk7XG5maXQoaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH19O1xuXG5yZXR1cm4gc3luY01ldGhvZDtcbiB9O1xuXG5jb25zdCBpc0F3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5hcmdHdWFyZCYmdHlwZW9mIGFyZ0d1YXJkPT09J29iamVjdCcmJmFyZ0d1YXJkLmtsYXNzPT09J2F3YWl0QXJnJztcblxuY29uc3QgZGVzeW5jPShtZXRob2RHdWFyZCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcz1bXSxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpfHxcbkZhaWwgYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG5jb25zdCByYXdBcmdHdWFyZHM9Wy4uLmFyZ0d1YXJkcywuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbmNvbnN0IGF3YWl0SW5kZXhlcz1bXTtcbmZvcihsZXQgaT0wO2k8cmF3QXJnR3VhcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGFyZ0d1YXJkPXJhd0FyZ0d1YXJkc1tpXTtcbmlmKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpe1xucmF3QXJnR3VhcmRzW2ldPWFyZ0d1YXJkLmFyZ0d1YXJkO1xuYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gfVxuIH1cbnJldHVybntcbmF3YWl0SW5kZXhlcyxcbnJhd01ldGhvZEd1YXJkOntcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZH19O1xuXG5cbiB9O1xuXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7YXdhaXRJbmRleGVzLHJhd01ldGhvZEd1YXJkfT1kZXN5bmMobWV0aG9kR3VhcmQpO1xuY29uc3R7YXN5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuYXN5bmNNZXRob2QoLi4uYXJncyl7XG5jb25zdCBhd2FpdExpc3Q9YXdhaXRJbmRleGVzLm1hcCgoaSk9PmFyZ3NbaV0pO1xuY29uc3QgcD1Qcm9taXNlLmFsbChhd2FpdExpc3QpO1xuY29uc3QgcmF3QXJncz1bLi4uYXJnc107XG5jb25zdCByZXN1bHRQPUUud2hlbihwLChhd2FpdGVkQXJncyk9PntcbmZvcihsZXQgaj0wO2o8YXdhaXRJbmRleGVzLmxlbmd0aDtqKz0xKXtcbnJhd0FyZ3NbYXdhaXRJbmRleGVzW2pdXT1hd2FpdGVkQXJnc1tqXTtcbiB9XG5kZWZlbmRTeW5jQXJncyhyYXdBcmdzLHJhd01ldGhvZEd1YXJkLGxhYmVsKTtcbnJldHVybiBhcHBseShtZXRob2QsdGhpcyxyYXdBcmdzKTtcbiB9KTtcbnJldHVybiBFLndoZW4ocmVzdWx0UCwocmVzdWx0KT0+e1xuZml0KGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9KTtcbiB9fTtcblxucmV0dXJuIGFzeW5jTWV0aG9kO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtrbGFzcyxjYWxsS2luZH09bWV0aG9kR3VhcmQ7XG5hc3NlcnQoa2xhc3M9PT0nbWV0aG9kR3VhcmQnKTtcbmlmKGNhbGxLaW5kPT09J3N5bmMnKXtcbnJldHVybiBkZWZlbmRTeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfWVsc2V7XG5hc3NlcnQoY2FsbEtpbmQ9PT0nYXN5bmMnKTtcbnJldHVybiBkZWZlbmRBc3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kVGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxubWV0aG9kR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCdmdW5jdGlvbicpO1xuXG5jb25zdCBnZXRDb250ZXh0PShzZWxmKT0+e1xuY29uc3QgY29udGV4dD1jb250ZXh0TWFwLmdldChzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLGNvbnRleHQsYXJncyk7XG4gfX06XG5cbntcbm1ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxudWxsLFtjb250ZXh0LC4uLmFyZ3NdKTtcbiB9fTtcblxuaWYobWV0aG9kR3VhcmQpe1xubWV0aG9kPWRlZmVuZE1ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbWV0aG9kVGFnKTtcbiB9XG5kZWZpbmVQcm9wZXJ0aWVzKG1ldGhvZCx7XG5uYW1lOnt2YWx1ZTptZXRob2RUYWd9LFxubGVuZ3RoOntcbnZhbHVlOnRoaXNmdWxNZXRob2RzP2JlaGF2aW9yTWV0aG9kLmxlbmd0aDpiZWhhdmlvck1ldGhvZC5sZW5ndGgtMX19KTtcblxuXG5yZXR1cm4gbWV0aG9kO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtXZWFrTWFwfSBjb250ZXh0TWFwXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbaW50ZXJmYWNlR3VhcmRdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBwcm90b3R5cGU9e307XG5jb25zdCBtZXRob2ROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuLyogQnkgaWdub3JpbmcgYW55IG1ldGhvZCBuYW1lZCBcImNvbnN0cnVjdG9yXCIsIHdlIGNhbiB1c2UgYSovXG4vKiBjbGFzcy5wcm90b3R5cGUgYXMgYSBiZWhhdmlvck1ldGhvZHMuKi9cbihuYW1lKT0+bmFtZSE9PSdjb25zdHJ1Y3RvcicpO1xuXG5sZXQgbWV0aG9kR3VhcmRzO1xuaWYoaW50ZXJmYWNlR3VhcmQpe1xuY29uc3R7XG5rbGFzcyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHM6bWcsXG5zbG9wcHk9ZmFsc2V9PVxuaW50ZXJmYWNlR3VhcmQ7XG5tZXRob2RHdWFyZHM9bWc7XG5hc3NlcnQuZXF1YWwoa2xhc3MsJ0ludGVyZmFjZScpO1xuYXNzZXJ0LnR5cGVvZihpbnRlcmZhY2VOYW1lLCdzdHJpbmcnKTtcbntcbmNvbnN0IG1ldGhvZEd1YXJkTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgdW5pbXBsZW1lbnRlZD1saXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLG1ldGhvZE5hbWVzKTtcbnVuaW1wbGVtZW50ZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5pZighc2xvcHB5KXtcbmNvbnN0IHVuZ3VhcmRlZD1saXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcyxtZXRob2RHdWFyZE5hbWVzKTtcbnVuZ3VhcmRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuIH1cbiB9XG4gfVxuZm9yKGNvbnN0IHByb3Agb2YgbWV0aG9kTmFtZXMpe1xucHJvdG90eXBlW3Byb3BdPWJpbmRNZXRob2QoXG4gYEluICR7cShwcm9wKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZHNbcHJvcF0sXG50aGlzZnVsTWV0aG9kcyxcbi8qIFRPRE8gc29tZSB0b29sIGRvZXMgbm90IHlldCB1bmRlcnN0YW5kIHRoZSBgPy5bYCBzeW50YXgqL1xubWV0aG9kR3VhcmRzJiZtZXRob2RHdWFyZHNbcHJvcF0pO1xuXG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5yZXR1cm4gRmFyKHRhZyxwcm90b3R5cGUpO1xuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2ZhckNsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIFtUID0gYW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQ29udGV4dFxuICogQHByb3BlcnR5IHtTfSBzdGF0ZVxuICogQHByb3BlcnR5IHtUfSBzZWxmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi8kaOKAjV9vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7V2Vha01hcDxULENvbnRleHQ8UywgVD4+fSAqL1xuY29uc3QgY29udGV4dE1hcD1uZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvdG90eXBlPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbmNvbnRleHRNYXAsXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxuY29uc3QgbWFrZUluc3RhbmNlPSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qKiBAdHlwZSB7VH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xuY29uc3Qgc2VsZj1oYXJkZW4oe19fcHJvdG9fXzpwcm90b3R5cGV9KTtcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q29udGV4dDxTLFQ+fSAqL1xuY29uc3QgY29udGV4dD1mcmVlemUoe3N0YXRlLHNlbGZ9KTtcbmNvbnRleHRNYXAuc2V0KHNlbGYsY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gc2VsZjtcbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzcyhkZWZpbmVIZWFwRmFyQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBGIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge0YgJiBUaGlzVHlwZTx7IGZhY2V0czogRiwgc3RhdGU6IFMgfT4gfSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IGZhY2V0TmFtZXM9b3duS2V5cyhtZXRob2RzS2l0KTtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcblxuY29uc3QgY29udGV4dE1hcEtpdD1vYmplY3RNYXAobWV0aG9kc0tpdCwoKT0+bmV3IFdlYWtNYXAoKSk7XG5jb25zdCBwcm90b3R5cGVLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKG1ldGhvZHMsZmFjZXROYW1lKT0+XG5kZWZlbmRQcm90b3R5cGUoXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGNvdWxkIGJlIHN5bWJvbCovXG4gYCR7dGFnfSAke2ZhY2V0TmFtZX1gLFxuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLFxubWV0aG9kcyxcbnRydWUsXG5pbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdKSk7XG5cblxuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuY29uc3QgY29udGV4dD17c3RhdGV9O1xuY29uc3QgZmFjZXRzPW9iamVjdE1hcChwcm90b3R5cGVLaXQsKHByb3RvdHlwZSxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gZmFjZXRzO1xuIH07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIHh4eCovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzc0tpdChkZWZpbmVIZWFwRmFyQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2Q+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGVhcEZhckluc3RhbmNlPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lSGVhcEZhckNsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUhlYXBGYXJJbnN0YW5jZShtYWtlSGVhcEZhckluc3RhbmNlKTtcbmhhcmRlbihtYWtlSGVhcEZhckluc3RhbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lSGVhcEZhckNsYXNzIjpbImRlZmluZUhlYXBGYXJDbGFzcyJdLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiOlsiZGVmaW5lSGVhcEZhckNsYXNzS2l0Il0sIm1ha2VIZWFwRmFySW5zdGFuY2UiOlsibWFrZUhlYXBGYXJJbnN0YW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACidUd8tQcAALUHAAAzAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIGNvbW1lbnRlZCBvdXQgdHlwZSBzaG91bGQgYmUgaW4gdGhpcyBmaWxlLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgdGhlcmUqL1xuLyogYW5kIGluIGV4cG9ydHMuanMqL1xuXG4vKiAvKioqL1xuLyogKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlciovXG4vKiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzKi9cbi8qICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnMqL1xuLyogKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuKi9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkKi9cbi8qICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nKi9cbi8qICogbWF0Y2hUYWcuIElzIHRoaXMgYSB2YWxpZCBwYXlsb2FkIGZvciBhIE1hdGNoZXIgd2l0aCB0aGF0IHRhZz8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBtYXRjaGVyUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlcyovXG4vKiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0cyovXG4vKiAqIHBheWxvYWQsIGRvZXMgdGhpcyBzcGVjaW1lbiBtYXRjaCB0aGF0IE1hdGNoZXI/Ki9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhwYXlsb2FkOiBQYXNzYWJsZSkgPT4gUmFua0NvdmVyfSBnZXRSYW5rQ292ZXIqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gUmV0dXJuIGEgUmFua0NvdmVyIHRvIGJvdW5kIGZyb20gYmVsb3cgYW5kIGFib3ZlLCovXG4vKiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuKi9cbi8qICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZSovXG4vKiAqIG1hdGNoaW5nIHNwZWNpbWVuLiBUaGUgcmlnaHQgZWxlbWVudCBtdXN0IGJlIGFmdGVyIG9yIHRoZSBzYW1lKi9cbi8qICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uKi9cbi8qICpYLyovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABoEOvTNyAAAzcgAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vcmFua09yZGVyLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXlQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiIsImNoZWNrTWF0Y2hlcyIsImRlZmF1bHRMaW1pdHMiLCJmaXQiLCJnZXRSYW5rQ292ZXIiLCJpc0tleVBhdHRlcm4iLCJpc1BhdHRlcm4iLCJtYXRjaGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGhhc093blByb3BlcnR5T2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2UsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGlzU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWc7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhcHBseUxhYmVsaW5nRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRo4oCNX2EpXV0sW1wiZnJvbVVuaXF1ZUVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjigI1fYSldXSxbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRo4oCNX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjigI1fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wia2V5R1RcIiwgWyRo4oCNX2EgPT4gKGtleUdUID0gJGjigI1fYSldXSxbXCJrZXlHVEVcIiwgWyRo4oCNX2EgPT4gKGtleUdURSA9ICRo4oCNX2EpXV0sW1wia2V5TFRcIiwgWyRo4oCNX2EgPT4gKGtleUxUID0gJGjigI1fYSldXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2EgPT4gKGtleUxURSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrS2V5ID0gJGjigI1fYSldXSxbXCJpc0tleVwiLCBbJGjigI1fYSA9PiAoaXNLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChjaGVja1NjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wiaXNTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGlzU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlNYXAgPSAkaOKAjV9hKV1dLFtcImNvcHlNYXBLZXlTZXRcIiwgWyRo4oCNX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyx2YWx1ZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSBXZWFrU2V0PFBhdHRlcm4+ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdD0oc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKT0+e1xuaWYoXG5NYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSsxPD1cbmRlY2ltYWxEaWdpdHNMaW1pdClcbntcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgKTtcblxuIH07XG5cbi8qKlxuICogQHJldHVybnMge1BhdHRlcm5LaXR9XG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0PSgpPT57XG4vKipcbiAqIElmIHRoaXMgaXMgYSByZWNvZ25pemVkIG1hdGNoIHRhZywgcmV0dXJuIHRoZSBNYXRjaEhlbHBlci5cbiAqIE90aGVyd2lzZSByZXN1bHQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtNYXRjaEhlbHBlcj19XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGlzS2V5UGF0dGVybiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7Q2hlY2tLZXlQYXR0ZXJufSAqL1xuY29uc3QgY2hlY2tLZXlQYXR0ZXJuPShwYXR0LGNoZWNrKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogSW4gcHJpbmNpcGxlLCBhbGwga2V5cyBhcmUgcGF0dGVybnMsIGJ1dCBvbmx5IHNjYWxhcnMgYXJlIGN1cnJlbnRseSovXG4vKiBzdXBwb3J0ZWQgYXMga2V5cy4qL1xucmV0dXJuIGNoZWNrKGlzU2NhbGFyS2V5KHBhdHQpLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrS2V5UGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2V5UGF0dGVybkludGVybmFsPShwYXR0LGNoZWNrKT0+e1xuLyogUHVycG9zZWx5IHBhcmFsbGVscyBjaGVja0tleS4gVE9ETyByZXVzZSBtb3JlIGxvZ2ljIGJldHdlZW4gdGhlbS4qL1xuLyogTW9zdCBvZiB0aGUgdGV4dCBvZiB0aGUgc3dpdGNoIGJlbG93IG5vdCBkZWFsaW5nIHdpdGggbWF0Y2hlcnMgaXMqL1xuLyogZXNzZW50aWFsbHkgaWRlbnRpY2FsLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGF0dCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyhwYXR0KTtcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbmlmKG1hdGNoSGVscGVyIT09dW5kZWZpbmVkKXtcbi8qIFRoaXMgY2hlY2sgZ3VhcmFudGVlcyB0aGUgcGF5bG9hZCBpbnZhcmlhbnRzIGFzc3VtZWQgYnkgdGhlIG90aGVyKi9cbi8qIG1hdGNoSGVscGVyIG1ldGhvZHMuKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0tleVBhdHRlcm4ocGF0dC5wYXlsb2FkLGNoZWNrKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBub24tc2NhbGFyIGtleXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24tcGF0dGVybnMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtwYXR0fWA7XG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzS2V5UGF0dGVybj0ocGF0dCk9PmNoZWNrS2V5UGF0dGVybihwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKi9cbmNvbnN0IGFzc2VydEtleVBhdHRlcm49KHBhdHQpPT57XG5jaGVja0tleVBhdHRlcm4ocGF0dCxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBtYXRjaGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTWF0Y2hlcz0oc3BlY2ltZW4scGF0dGVybixjaGVjayxsYWJlbD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5hcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsW3NwZWNpbWVuLHBhdHRlcm4sY2hlY2tdLGxhYmVsKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWw9KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG4vKiBXb3J0aCBiZWluZyBhIGJpdCB2ZXJib3NlIGFuZCByZXBldGl0aXZlIGluIG9yZGVyIHRvIG9wdGltaXplKi9cbmNvbnN0IHBhdHRlcm5LaW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbmNvbnN0IHNwZWNpbWVuS2luZD1raW5kT2Yoc3BlY2ltZW4pOy8qIG1heSBiZSB1bmRlZmluZWQqL1xuc3dpdGNoKHBhdHRlcm5LaW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBGYWlsIGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBGYWlsIGBwcm9taXNlcyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiBGYWlsIGBlcnJvcnMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzpcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlCYWcnOlxuY2FzZSdyZW1vdGFibGUnOntcbi8qIFRoZXNlIGtpbmRzIGFyZSBuZWNlc3NhcmlseSBrZXlzKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7bGVuZ3RofT1wYXR0O1xuaWYoc3BlY2ltZW4ubGVuZ3RoIT09bGVuZ3RoKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbnJldHVybiBwYXR0LmV2ZXJ5KChwLGkpPT5jaGVja01hdGNoZXMoc3BlY2ltZW5baV0scCxjaGVjayxpKSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG4vKiBUT0RPIERldGVjdCBhbmQgYWNjdW11bGF0ZSBkaWZmZXJlbmNlIGluIG9uZSBwYXNzLiovXG4vKiBSYXRoZXIgdGhhbiB1c2luZyB0d28gY2FsbHMgdG8gYGxpc3REaWZmZXJlbmNlYCB0byBkZXRlY3QgYW5kKi9cbi8qIHJlcG9ydCBpZiBhbmQgaG93IHRoZXNlIGxpc3RzIGRpZmZlciwgc2luY2UgdGhleSBhcmUgYWxyZWFkeSovXG4vKiBpbiBzb3J0ZWQgb3JkZXIsIHdlIHNob3VsZCBpbnN0ZWFkIHVzZSBhbiBhbGdvcml0aG0gbGlrZSovXG4vKiBgaXRlckRpc2pvaW50VW5pb25gIGZyb20gbWVyZ2Utc29ydC1vcGVyYXRvcnMuanMqL1xuY29uc3Qgc3BlY2ltZW5OYW1lcz1yZWNvcmROYW1lcyhzcGVjaW1lbik7XG5jb25zdCBwYXR0TmFtZXM9cmVjb3JkTmFtZXMocGF0dCk7XG5jb25zdCBtaXNzaW5nPWxpc3REaWZmZXJlbmNlKHBhdHROYW1lcyxzcGVjaW1lbk5hbWVzKTtcbmlmKG1pc3NpbmcubGVuZ3RoPj0xKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGhhdmUgbWlzc2luZyBwcm9wZXJ0aWVzICR7cShtaXNzaW5nKX1gKTtcblxuIH1cbmNvbnN0IHVuZXhwZWN0ZWQ9bGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcyxwYXR0TmFtZXMpO1xuaWYodW5leHBlY3RlZC5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG51bmV4cGVjdGVkKVxuIH1gKTtcblxuIH1cbmNvbnN0IHNwZWNpbWVuVmFsdWVzPXJlY29yZFZhbHVlcyhzcGVjaW1lbixzcGVjaW1lbk5hbWVzKTtcbmNvbnN0IHBhdHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHBhdHQscGF0dE5hbWVzKTtcbnJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSxwYXR0VmFsdWVzW2ldLGNoZWNrLGxhYmVsKSk7XG5cbiB9XG5jYXNlJ2NvcHlNYXAnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5TWFwJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlNYXAgdG8gbWF0Y2ggYSBjb3B5TWFwIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbmNvbnN0e3BheWxvYWQ6cGF0dFBheWxvYWR9PXBhdHQ7XG5jb25zdHtwYXlsb2FkOnNwZWNpbWVuUGF5bG9hZH09c3BlY2ltZW47XG5jb25zdCBwYXR0S2V5U2V0PWNvcHlNYXBLZXlTZXQocGF0dFBheWxvYWQpO1xuY29uc3Qgc3BlY2ltZW5LZXlTZXQ9Y29weU1hcEtleVNldChzcGVjaW1lblBheWxvYWQpO1xuLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbmlmKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQscGF0dEtleVNldCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHBhdHRWYWx1ZXM9cGF0dFBheWxvYWQudmFsdWVzO1xuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9c3BlY2ltZW5QYXlsb2FkLnZhbHVlcztcbi8qIGNvbXBhcmUgdmFsdWVzIGFzIGNvcHlBcnJheXMqL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlcyxwYXR0VmFsdWVzLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuaWYobWF0Y2hIZWxwZXIpe1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IG1hdGNoZXM9KHNwZWNpbWVuLHBhdHQpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogUmV0dXJuaW5nIG5vcm1hbGx5IGluZGljYXRlcyBzdWNjZXNzLiBNYXRjaCBmYWlsdXJlIGlzIGluZGljYXRlZCBieVxuICogdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKi9cbmNvbnN0IGZpdD0oc3BlY2ltZW4scGF0dCxsYWJlbD11bmRlZmluZWQpPT57XG5pZihjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIsbGFiZWwpKXtcbnJldHVybjtcbiB9XG4vKiBzaG91bGQgb25seSB0aHJvdyovXG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxhc3NlcnRDaGVja2VyLGxhYmVsKTtcbkZhaWwgYGludGVybmFsOiAke2xhYmVsfTogaW5jb25zaXN0ZW50IHBhdHRlcm4gbWF0Y2g6ICR7cShwYXR0KX1gO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGdldFJhbmtDb3ZlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7R2V0UmFua0NvdmVyfSAqL1xuY29uc3QgZ2V0UmFua0NvdmVyPShwYXR0LGVuY29kZVBhc3NhYmxlKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQYXNzYWJsZShwYXR0KTtcbmlmKGVuY29kZWQhPT11bmRlZmluZWQpe1xucmV0dXJuW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuIH1cbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGF0dCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weUFycmF5Jzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlBcnJheXMuKi9cbi8qKi9cbi8qIGNvbnN0IHJhbmtDb3ZlcnMgPSBwYXR0Lm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogcmFua0NvdmVycy5tYXAoKFtsZWZ0LCBfcmlnaHRdKSA9PiBsZWZ0KSwqL1xuLyogcmFua0NvdmVycy5tYXAoKFtfbGVmdCwgcmlnaHRdKSA9PiByaWdodCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVJlY29yZHMuKi9cbi8qKi9cbi8qIGNvbnN0IHBhdHRLZXlzID0gb3duS2V5cyhwYXR0KTsqL1xuLyogY29uc3QgcGF0dEVudHJpZXMgPSBoYXJkZW4ocGF0dEtleXMubWFwKGtleSA9PiBba2V5LCBwYXR0W2tleV1dKSk7Ki9cbi8qIGNvbnN0IFtsZWZ0RW50cmllc0xpbWl0LCByaWdodEVudHJpZXNMaW1pdF0gPSovXG4vKiBnZXRSYW5rQ292ZXIocGF0dEVudHJpZXMpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMobGVmdEVudHJpZXNMaW1pdCksKi9cbi8qIGZyb21VbmlxdWVFbnRyaWVzKHJpZ2h0RW50cmllc0xpbWl0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVNldHMuKi9cbi8qKi9cbi8qIC8vIFNob3VsZCBhbHJlYWR5IGJlIHZhbGlkYXRlZCBieSBjaGVja1BhdHRlcm4uIEJ1dCBiZWNhdXNlIHRoaXMqL1xuLyogLy8gaXMgYSBjaGVjayB0aGF0IG1heSBsb29zZW4gb3ZlciB0aW1lLCB3ZSBhbHNvIGFzc2VydCovXG4vKiAvLyBldmVyeXdoZXJlIHdlIHN0aWxsIHJlbHkgb24gdGhlIHJlc3RyaWN0aW9uLiovXG4vKiBgYGBqcyovXG4vKiBwYXR0LnBheWxvYWQubGVuZ3RoID09PSAxIHx8Ki9cbi8qIEZhaWxgTm9uLXNpbmdsZXRvbiBjb3B5U2V0cyB3aXRoIG1hdGNoZXIgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXR0fWA7Ki9cbi8qIGBgYCovXG4vKiovXG4vKiBjb25zdCBbbGVmdEVsZW1lbnRMaW1pdCwgcmlnaHRFbGVtZW50TGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWRbMF0sKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlQ29weVNldChbbGVmdEVsZW1lbnRMaW1pdF0pLCovXG4vKiBtYWtlQ29weVNldChbcmlnaHRFbGVtZW50TGltaXRdKSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5TWFwcy4qL1xuLyoqL1xuLyogLy8gQSBtYXRjaGluZyBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLCBvciBhdCBtb3N0IG9uZSovXG4vKiAvLyBub24ta2V5IGtleSBwYXR0ZXJuLiBUaHVzIHdlIGNhbiBhc3N1bWUgdGhhdCB2YWx1ZSBwb3NpdGlvbnMqL1xuLyogLy8gbWF0Y2ggMS10by0xLiovXG4vKiAvLyovXG4vKiAvLyBUT0RPIEkgbWF5IGJlIG92ZXJsb29raW5nIHRoYXQgdGhlIGxlc3MgcHJlY2lzZSByYW5rT3JkZXIqL1xuLyogLy8gZXF1aXZhbGVuY2UgY2xhc3MgbWF5IGNhdXNlIHZhbHVlcyB0byBiZSBvdXQgb2Ygb3JkZXIsKi9cbi8qIC8vIG1ha2luZyB0aGlzIHJhbmtDb3ZlciBub3QgYWN0dWFsbHkgY292ZXIuIEluIHRoYXQgY2FzZSwgZm9yKi9cbi8qIC8vIGFsbCB0aGUgdmFsdWVzIGZvciBrZXlzIGF0IHRoZSBzYW1lIHJhbmssIHdlIHNob3VsZCB1bmlvbiB0aGVpciovXG4vKiAvLyByYW5rIGNvdmVycy4gVE9ETyBQT1NTSUJMRSBTSUxFTlQgQ09SUkVDVE5FU1MgQlVHKi9cbi8qIC8vKi9cbi8qIC8vIElmIHRoaXMgaXMgYSBidWcsIGl0IHByb2JhYmx5IGFmZmVjdHMgdGhlIGdldFJhbmtDb3ZlciovXG4vKiAvLyBjYXNlcyBvZiBtYXRjaExURUhlbHBlciBhbmQgbWF0Y2hHVEVIZWxwZXIgb24gY29weU1hcCBhcyovXG4vKiAvLyB3ZWxsLiBTZWUgbWFrZUNvcHlNYXAgZm9yIGFuIGlkZWEgb24gZml4aW5nKi9cbi8qIC8vIHRoaXMgYnVnLiovXG4vKiBjb25zdCBbbGVmdFBheWxvYWRMaW1pdCwgcmlnaHRQYXlsb2FkTGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWQsKi9cbi8qIGVuY29kZVBhc3NhYmxlLCovXG4vKiApOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIGxlZnRQYXlsb2FkTGltaXQpLCovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgcmlnaHRQYXlsb2FkTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuIH07XG5cbmNvbnN0IGFycmF5RXZlcnlNYXRjaFBhdHRlcm49KGFycmF5LHBhdHQsY2hlY2ssbGFiZWxQcmVmaXg9JycpPT57XG5pZihjaGVja0tpbmQocGF0dCwnbWF0Y2g6YW55JyxpZGVudENoZWNrZXIpKXtcbi8qIGlmIHRoZSBwYXR0ZXJuIGlzIE0uYW55KCksIHdlIGtub3cgaXRzIHRydWUqL1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGFycmF5LmV2ZXJ5KChlbCxpKT0+XG5jaGVja01hdGNoZXMoZWwscGF0dCxjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW55SGVscGVyPUZhcignbWF0Y2g6YW55IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihfc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWUsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihtYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxubWF0Y2hlclBheWxvYWQ9PT11bmRlZmluZWR8fFxuY2hlY2soZmFsc2UsWCBgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW5kSGVscGVyPUZhcignbWF0Y2g6YW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGNoZWNrKSk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRQYXR0cyxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxjaGVjayk7XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHthbGxlZ2VkUGF0dHN9YCkpJiZcbmFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KSk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG5pbnRlcnNlY3RSYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKSxcblxuXG5jaGVja0tleVBhdHRlcm46KHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsY2hlY2spKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoT3JIZWxwZXI9RmFyKCdtYXRjaDpvciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5jb25zdHtsZW5ndGh9PXBhdHRzO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cGF0dHN9YCk7XG5cbiB9XG5pZihcbnBhdHRzLmxlbmd0aD09PTImJlxuIW1hdGNoZXMoc3BlY2ltZW4scGF0dHNbMF0pJiZcbmNoZWNrS2luZChwYXR0c1swXSwnbWF0Y2g6a2luZCcsaWRlbnRDaGVja2VyKSYmXG5wYXR0c1swXS5wYXlsb2FkPT09J3VuZGVmaW5lZCcpXG57XG4vKiBXb3J0aCBzcGVjaWFsIGNhc2luZyB0aGUgb3B0aW9uYWwgcGF0dGVybiBmb3IqL1xuLyogYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHRzWzFdLGNoZWNrKTtcbiB9XG5pZihwYXR0cy5zb21lKChwYXR0KT0+bWF0Y2hlcyhzcGVjaW1lbixwYXR0KSkpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtwYXR0c31gKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihwYXR0cyxlbmNvZGVQYXNzYWJsZSk9PlxudW5pb25SYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKSxcblxuXG5jaGVja0tleVBhdHRlcm46KHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsY2hlY2spKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTm90SGVscGVyPUZhcignbWF0Y2g6bm90IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0LGNoZWNrKT0+e1xuaWYobWF0Y2hlcyhzcGVjaW1lbixwYXR0KSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfWVsc2V7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tQYXR0ZXJuLFxuXG5nZXRSYW5rQ292ZXI6KF9wYXR0LF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddLFxuXG5jaGVja0tleVBhdHRlcm59KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihraW5kLGNoZWNrKT0+e1xuc3dpdGNoKGtpbmQpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzpcbmNhc2UncmVtb3RhYmxlJzpcbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke2tpbmR9IGtleXMgYXJlIG5vdCBzdXBwb3J0ZWRgKTtcbiB9fVxuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soc3BlY2ltZW4+PTBuLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdzdHJpbmcnLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1zdHJpbmdMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzdHJpbmcgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN5bWJvbEhlbHBlcj1GYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3ltYm9sTmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnc3ltYm9sJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHN5bWJvbE5hbWU9bmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuaWYodHlwZW9mIHN5bWJvbE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuIH1cbnJldHVybiBjaGVjayhcbnN5bWJvbE5hbWUubGVuZ3RoPD1zeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG5YIGBTeW1ib2wgbmFtZSAke3EoXG5zeW1ib2xOYW1lKVxuIH0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyPUZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyZW1vdGFibGVEZXNjLGNoZWNrKT0+e1xuLyogVW5mb3J0dW5hdGUgZHVwbGljYXRpb24gb2YgY2hlY2tLaW5kIGxvZ2ljLCBidXQgbm8gYmV0dGVyIGNob2ljZXMuKi9cbmlmKGNoZWNrS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJyxpZGVudENoZWNrZXIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgc3BlY2ltZW5LaW5kPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHNwZWNpbWVuS2luZD09PSd0YWdnZWQnKXtcbnNwZWNpbWVuS2luZD1nZXRUYWcoc3BlY2ltZW4pO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuXG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChcblsgYCR7c3BlY2ltZW5LaW5kfSBgLGAgLSBNdXN0IGJlIGEgcmVtb3RhYmxlICgke2xhYmVsfSlgXSxcbnNwZWNpbWVuKTtcblxucmV0dXJuIGNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX3JlbW90YWJsZURlc2MsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaExURUhlbHBlcj1GYXIoJ21hdGNoOmx0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPD0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbi8qIHRvIGJlIGBsZXRgKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3UmlnaHRCb3VuZD0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbmlmKG5ld1JpZ2h0Qm91bmQhPT11bmRlZmluZWQpe1xucmlnaHRCb3VuZD1uZXdSaWdodEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRIZWxwZXI9RmFyKCdtYXRjaDpsdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3ZlcixcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RIZWxwZXI9RmFyKCdtYXRjaDpndCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3ZlcixcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXI9RmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1Qcm9wZXJ0aWVzTGltaXQscHJvcGVydHlOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSYmXG5jaGVjayhcbm93bktleXMoc3BlY2ltZW4pLmxlbmd0aDw9bnVtUHJvcGVydGllc0xpbWl0LFxuWCBgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtUHJvcGVydGllc0xpbWl0KVxuIH0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gKSYmXG5cbmVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVjayxcbltcbmtleS5sZW5ndGg8PXByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuWCBgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdClcbiB9YF0sXG5cbmtleSkmJlxuXG5jaGVja01hdGNoZXMoXG5oYXJkZW4oW2tleSx2YWx1ZV0pLFxuaGFyZGVuKFtrZXlQYXR0LHZhbHVlUGF0dF0pLFxuY2hlY2ssXG5rZXkpKSk7XG5cblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX2VudHJ5UGF0dCxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgUmVjb3JkcyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyPUZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3N1YlBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHthcnJheUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1hcnJheUxlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWApKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sc3ViUGF0dCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDphcnJheU9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfLGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBBcnJheXMgbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfLGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBDb3B5U2V0cyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hCYWdPZkhlbHBlcj1GYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsY291bnRQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QmFnJyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcblggYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0KVxuIH0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWApJiZcblxuc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbihba2V5LGNvdW50XSxpKT0+XG5jaGVja01hdGNoZXMoa2V5LGtleVBhdHQsY2hlY2ssIGBiYWcga2V5c1ske2l9XWApJiZcbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuW2NvdW50LGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVja10sXG4gYGJhZyBjb3VudHNbJHtpfV1gKSYmXG5cbmNoZWNrTWF0Y2hlcyhjb3VudCxjb3VudFBhdHQsY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YmFnT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYENvcHlCYWdzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE1hcE9mSGVscGVyPUZhcignbWF0Y2g6bWFwT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtTWFwRW50cmllc0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5TWFwJyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1udW1NYXBFbnRyaWVzTGltaXQsXG5YIGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxubnVtTWFwRW50cmllc0xpbWl0KVxuIH0gZW50cmllczogJHtzcGVjaW1lbn1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMsXG5rZXlQYXR0LFxuY2hlY2ssXG4nbWFwIGtleXMnKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbnZhbHVlUGF0dCxcbmNoZWNrLFxuJ21hcCB2YWx1ZXMnKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOm1hcE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX2VudHJ5UGF0dCxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgQ29weU1hcCBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRBcnJheVBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuY29uc3QgbnVtUmVxdWlyZWQ9cmVxdWlyZWRQYXR0Lmxlbmd0aDtcbmNvbnN0IG51bU9wdGlvbmFsPW9wdGlvbmFsUGF0dC5sZW5ndGg7XG5jb25zdCByZXF1aXJlZFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKDAsbnVtUmVxdWlyZWQpO1xuY29uc3Qgb3B0aW9uYWxTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShcbm51bVJlcXVpcmVkLFxubnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xuXG5jb25zdCByZXN0U3BlY2ltZW49c3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xucmV0dXJuIGhhcmRlbih7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn0pO1xuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gZWxlbWVudHMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7UGF0dGVybltdfSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRBcnJheVBhdHRlcm49KG9wdGlvbmFsUGF0dCxsZW5ndGgpPT5cbmhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCxsZW5ndGgpLm1hcCgocGF0dCk9Pk1NLm9wdChwYXR0KSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyPUZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PVtdLHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdEFycmF5UGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdEFycmF5UGF0dGVybihcbm9wdGlvbmFsUGF0dCxcbm9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoKTtcblxubGV0IGFyZ051bT0wO1xucmV0dXJuKFxuKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoPT09cmVxdWlyZWRQYXR0Lmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxucmVxdWlyZWRQYXR0Lmxlbmd0aClcbiB9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gKSkmJlxuXG5yZXF1aXJlZFBhdHQuZXZlcnkoKHAsaSk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSkmJlxuXG5wYXJ0aWFsUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSkmJlxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuXG5jaGVja0tleVBhdHRlcm46KFxuW19yZXF1aXJlZFBhdHQsX29wdGlvbmFsUGF0dD11bmRlZmluZWQsX3Jlc3RQYXR0PXVuZGVmaW5lZF0sXG5jaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgY29weVJlY29yZCBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXNzYWJsZT59IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgcmVzdFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPlxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cz0oc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk9Pntcbi8qIE5vdCBmcm96ZW4hIE11dGF0ZWQgaW4gcGxhY2UqL1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlcXVpcmVkRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCBvcHRpb25hbEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVzdEVudHJpZXM9W107XG5mb3IoY29uc3RbbmFtZSx2YWx1ZV1vZiBlbnRyaWVzKHNwZWNpbWVuKSl7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHJlcXVpcmVkUGF0dCxuYW1lKSl7XG5yZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNlIGlmKGhhc093blByb3BlcnR5T2Yob3B0aW9uYWxQYXR0LG5hbWUpKXtcbm9wdGlvbmFsRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2V7XG5yZXN0RW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe1xucmVxdWlyZWRTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXF1aXJlZEVudHJpZXMpLFxub3B0aW9uYWxTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxucmVzdFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlc3RFbnRyaWVzKX0pO1xuXG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiB2YWx1ZXMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuPShvcHRpb25hbFBhdHQsbmFtZXMpPT5cbmZyb21VbmlxdWVFbnRyaWVzKG5hbWVzLm1hcCgobmFtZSk9PltuYW1lLE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdFJlY29yZEhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9e30scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdFJlY29yZFBhcnRzKHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpO1xuXG5jb25zdCBwYXJ0aWFsTmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKG9wdGlvbmFsU3BlY2ltZW4pO1xuY29uc3QgcGFydGlhbFBhdHQ9YWRhcHRSZWNvcmRQYXR0ZXJuKG9wdGlvbmFsUGF0dCxwYXJ0aWFsTmFtZXMpO1xucmV0dXJuKFxuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4scmVxdWlyZWRQYXR0LGNoZWNrKSYmXG5wYXJ0aWFsTmFtZXMuZXZlcnkoKG5hbWUpPT5cbmNoZWNrTWF0Y2hlcyhcbm9wdGlvbmFsU3BlY2ltZW5bbmFtZV0sXG5wYXJ0aWFsUGF0dFtuYW1lXSxcbmNoZWNrLFxuIGAke25hbWV9P2ApKSYmXG5cblxuY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbixyZXN0UGF0dCxjaGVjaywnLi4ucmVzdCcpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weVJlY29yZCcmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlSZWNvcmQnKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbnJlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpLFxuXG5jaGVja0tleVBhdHRlcm46KFxuW19yZXF1aXJlZFBhdHQsX29wdGlvbmFsUGF0dD11bmRlZmluZWQsX3Jlc3RQYXR0PXVuZGVmaW5lZF0sXG5jaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgY29weVJlY29yZCBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbnJldHVybltiYXNlLG9wdGlvbmFsfHxlbXB0eSxyZXN0XTtcbiB9XG5pZihvcHRpb25hbCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbF07XG4gfVxucmV0dXJuW2Jhc2VdO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7QXJnR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1VbmRlZmluZWRTaGFwZSk9PlxuaGFyZGVuKHtcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkLFxucmV0dXJuR3VhcmR9KX0pO1xuXG5cblxuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5oYXJkZW4oe1xua2xhc3M6J2F3YWl0QXJnJyxcbmFyZ0d1YXJkfSk7XG5cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaGVyTmFtZXNwYWNlfSAqL1xuY29uc3QgTT1oYXJkZW4oe1xuYW55OigpPT5BbnlTaGFwZSxcbmFuZDooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6YW5kJyxwYXR0cyksXG5vcjooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6b3InLHBhdHRzKSxcbm5vdDooc3ViUGF0dCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLHN1YlBhdHQpLFxuXG5zY2FsYXI6KCk9PlNjYWxhclNoYXBlLFxua2V5OigpPT5LZXlTaGFwZSxcbnBhdHRlcm46KCk9PlBhdHRlcm5TaGFwZSxcbmtpbmQ6bWFrZUtpbmRNYXRjaGVyLFxuYm9vbGVhbjooKT0+Qm9vbGVhblNoYXBlLFxubnVtYmVyOigpPT5OdW1iZXJTaGFwZSxcbmJpZ2ludDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLFtsaW1pdHNdKTpCaWdJbnRTaGFwZSxcbm5hdDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLFtsaW1pdHNdKTpOYXRTaGFwZSxcbnN0cmluZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLFtsaW1pdHNdKTpTdHJpbmdTaGFwZSxcbnN5bWJvbDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLFtsaW1pdHNdKTpTeW1ib2xTaGFwZSxcbnJlY29yZDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ucmVjb3JkT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6UmVjb3JkU2hhcGUsXG5hcnJheToobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYXJyYXlPZihNLmFueSgpLGxpbWl0cyk6QXJyYXlTaGFwZSxcbnNldDoobGltaXRzPXVuZGVmaW5lZCk9PmxpbWl0cz9NLnNldE9mKE0uYW55KCksbGltaXRzKTpTZXRTaGFwZSxcbmJhZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYmFnT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6QmFnU2hhcGUsXG5tYXA6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLm1hcE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOk1hcFNoYXBlLFxucmVtb3RhYmxlOm1ha2VSZW1vdGFibGVNYXRjaGVyLFxuZXJyb3I6KCk9PkVycm9yU2hhcGUsXG5wcm9taXNlOigpPT5Qcm9taXNlU2hhcGUsXG51bmRlZmluZWQ6KCk9PlVuZGVmaW5lZFNoYXBlLFxubnVsbDooKT0+bnVsbCxcblxubHQ6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdCcscmlnaHRPcGVyYW5kKSxcbmx0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScscmlnaHRPcGVyYW5kKSxcbmVxOihrZXkpPT57XG5hc3NlcnRLZXkoa2V5KTtcbnJldHVybiBrZXk9PT11bmRlZmluZWQ/TS51bmRlZmluZWQoKTprZXk7XG4gfSxcbm5lcTooa2V5KT0+TS5ub3QoTS5lcShrZXkpKSxcbmd0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScscmlnaHRPcGVyYW5kKSxcbmd0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLHJpZ2h0T3BlcmFuZCksXG5cbnJlY29yZE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5hcnJheU9mOihzdWJQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLFtzdWJQYXR0LGxpbWl0c10pLFxuc2V0T2Y6KGtleVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLFtrZXlQYXR0LGxpbWl0c10pLFxuYmFnT2Y6KGtleVBhdHQ9TS5hbnkoKSxjb3VudFBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmFnT2YnLFtrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHNdKSxcbm1hcE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5zcGxpdEFycmF5OihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRBcnJheScsXG5tYWtlU3BsaXRQYXlsb2FkKFtdLGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdFJlY29yZDooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0UmVjb3JkJyxcbm1ha2VTcGxpdFBheWxvYWQoe30sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0OihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShiYXNlLHJlc3QmJltdLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSxyZXN0JiZ7fSxyZXN0KTtcbiB9XG4gfSxcbnBhcnRpYWw6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KFtdLGJhc2UscmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZCh7fSxiYXNlLHJlc3QpO1xuIH1cbiB9LFxuXG5lcmVmOih0KT0+TS5vcih0LE0ucHJvbWlzZSgpKSxcbm9wdDoodCk9Pk0ub3IoTS51bmRlZmluZWQoKSx0KSxcblxuaW50ZXJmYWNlOihpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyx7c2xvcHB5PWZhbHNlfT17fSk9PntcbmZvcihjb25zdFtfLG1ldGhvZEd1YXJkXW9mIGVudHJpZXMobWV0aG9kR3VhcmRzKSl7XG5tZXRob2RHdWFyZC5rbGFzcz09PSdtZXRob2RHdWFyZCd8fFxuRmFpbCBgdW5yZWNvZ25pemUgbWV0aG9kIGd1YXJkICR7bWV0aG9kR3VhcmR9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkcyxcbnNsb3BweX0pO1xuXG4gfSxcbmNhbGw6KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdHdWFyZHMpLFxuY2FsbFdoZW46KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsYXJnR3VhcmRzKSxcblxuYXdhaXQ6KGFyZ0d1YXJkKT0+bWFrZUF3YWl0QXJnR3VhcmQoYXJnR3VhcmQpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxuZml0LFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmFzc2VydEtleVBhdHRlcm4sXG5pc0tleVBhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfSk7XG5cbiB9O1xuXG4vKiBPbmx5IGluY2x1ZGUgdGhvc2Ugd2hvc2UgbWVhbmluZyBpcyBpbmRlcGVuZGVudCBvZiBhbiBpbXB1dGVkIHNvcnQgb3JkZXIqL1xuLyogb2YgcmVtb3RhYmxlcywgb3Igb2YgZW5jb2Rpbmcgb2YgcGFzc2FibGUgYXMgc29ydGFibGUgc3RyaW5ncy4gVGh1cywqL1xuLyogZ2V0UmFua0NvdmVyIGlzIG9taXR0ZWQuIFRvIGdldCBvbmUsIHlvdSdkIG5lZWQgdG8gaW5zdGFudGlhdGUqL1xuLyogYG1ha2VQYXR0ZXJuS2l0KClgIHlvdXJzZWxmLiBTaW5jZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGV4dGVybmFsKi9cbi8qIHVzZXMgb2YgYGdldFJhbmtDb3ZlcmAsIGZvciBjbGFyaXR5IGR1cmluZyBkZXZlbG9wbWVudCwgYG1ha2VQYXR0ZXJuS2l0YCovXG4vKiBpcyBub3QgY3VycmVudGx5IGV4cG9ydGVkLiovXG5jb25zdCAgICAgICB7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxuZml0LFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmFzc2VydEtleVBhdHRlcm4sXG5pc0tleVBhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfT1cbm1ha2VQYXR0ZXJuS2l0KCk7JGjigI1fb25jZS5jaGVja01hdGNoZXMoY2hlY2tNYXRjaGVzKTskaOKAjV9vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjigI1fb25jZS5maXQoZml0KTskaOKAjV9vbmNlLmFzc2VydFBhdHRlcm4oYXNzZXJ0UGF0dGVybik7JGjigI1fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaOKAjV9vbmNlLmFzc2VydEtleVBhdHRlcm4oYXNzZXJ0S2V5UGF0dGVybik7JGjigI1fb25jZS5pc0tleVBhdHRlcm4oaXNLZXlQYXR0ZXJuKTskaOKAjV9vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRo4oCNX29uY2UuTShNKTtcblxuTU09TTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwiZml0IjpbImZpdCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJhc3NlcnRLZXlQYXR0ZXJuIjpbImFzc2VydEtleVBhdHRlcm4iXSwiaXNLZXlQYXR0ZXJuIjpbImlzS2V5UGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABzKVNO8DwAAPA8AAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVBhc3NhYmxlLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnZXRUYWcsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZU9mLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxzZXRQcm90b3R5cGVPZixpc309T2JqZWN0O1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gdXNlZCBieSBKYXZhU2NyaXB0J3MgTWFwIGFuZCBTZXRcbiAqIGFic3RyYWN0aW9ucywgd2hlcmUgTmFOIGlzIHRoZSBzYW1lIGFzIE5hTiBhbmQgLTAgaXMgdGhlIHNhbWUgYXNcbiAqIDAuIE1hcnNoYWwgc2VyaWFsaXplcyAtMCBhcyB6ZXJvLCBzbyB0aGUgc2VtYW50aWNzIG9mIG91ciBkaXN0cmlidXRlZFxuICogb2JqZWN0IHN5c3RlbSBkb2VzIG5vdCBkaXN0aW5ndWlzaCAwIGZyb20gLTAuXG4gKlxuICogYHNhbWVWYWx1ZVplcm9gIGlzIHRoZSBFY21hU2NyaXB0IHNwZWMgbmFtZSBmb3IgdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uLFxuICogYnV0IFRPRE8gd2UgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGUgQVBJLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4XG4gKiBAcGFyYW0ge2FueX0geVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm89KHgseSk9Png9PT15fHxpcyh4LHkpO1xuXG5jb25zdCB0cml2aWFsQ29tcGFyYXRvcj0obGVmdCxyaWdodCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmxlZnQ8cmlnaHQ/LTE6bGVmdD09PXJpZ2h0PzA6MTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFBhc3NTdHlsZSwgeyBpbmRleDogbnVtYmVyLCBjb3ZlcjogUmFua0NvdmVyIH0+fSBQYXNzU3R5bGVSYW5rc1JlY29yZFxuICovXG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzPS8qKiBAdHlwZSB7UGFzc1N0eWxlUmFua3NSZWNvcmR9ICovXG5mcm9tRW50cmllcyhcbmVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4vKiBTb3J0IGVudHJpZXMgYnkgYXNjZW5kaW5nIHByZWZpeC4qLy5cbnNvcnQoKFtfbGVmdFN0eWxlLGxlZnRQcmVmaXhlc10sW19yaWdodFN0eWxlLHJpZ2h0UHJlZml4ZXNdKT0+e1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcyxyaWdodFByZWZpeGVzKTtcbiB9KS5cbm1hcCgoW3Bhc3NTdHlsZSxwcmVmaXhlc10saW5kZXgpPT57XG4vKiBDb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYW55IGNoYXJhY3RlciBpbiBgcHJlZml4ZXNgLCovXG4vKiB2ZXJpZnlpbmcgdGhhdCBpdCBpcyBzb3J0ZWQgc28gdGhhdCBpcyovXG4vKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xucHJlZml4ZXM9PT1bLi4ucHJlZml4ZXNdLnNvcnQoKS5qb2luKCcnKXx8XG5GYWlsIGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuY29uc3QgY292ZXI9W1xucHJlZml4ZXMuY2hhckF0KDApLFxuU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aC0xKSsxKV07XG5cbnJldHVybltwYXNzU3R5bGUse2luZGV4LGNvdmVyfV07XG4gfSkpO1xuXG5cbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLyoqXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0UGFzc1N0eWxlQ292ZXI9KHBhc3NTdHlsZSk9PnBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjigI1fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFdlYWtTZXQ8UGFzc2FibGVbXT4+fVxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQ9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxSYW5rQ29tcGFyZT59XG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlPX0gY29tcGFyZVJlbW90YWJsZXNcbiAqIEFuIG9wdGlvbiB0byBjcmVhdGUgYSBjb21wYXJhdG9yIGluIHdoaWNoIGFuIGludGVybmFsIG9yZGVyIGlzXG4gKiBhc3NpZ25lZCB0byByZW1vdGFibGVzLiBUaGlzIGRlZmF1bHRzIHRvIGEgY29tcGFyYXRvciB0aGF0XG4gKiBhbHdheXMgcmV0dXJucyBgMGAsIG1lYW5pbmcgdGhhdCBhbGwgcmVtb3RhYmxlcyBhcmUgdGllZFxuICogZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29tcGFyYXRvcktpdD0oY29tcGFyZVJlbW90YWJsZXM9KF94LF95KT0+MCk9Pntcbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBjb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+e1xuaWYoc2FtZVZhbHVlWmVybyhsZWZ0LHJpZ2h0KSl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKFxucGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbnBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4KTtcblxuIH1cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IoXG5yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpLFxucmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbiB9O1xuXG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgYW50aUNvbXBhcmF0b3I9KHgseSk9PmNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChjb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGNvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3IpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsY29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3J9KTtcbiB9O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjigI1fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFJhbmtTb3J0ZWQ9KHNvcnRlZCxjb21wYXJlKT0+XG5pc1JhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpfHxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRo4oCNX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBUT0RPIFNFQ1VSSVRZIEJVRzogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MjYwXG4gKiBzb3J0QnlSYW5rIGN1cnJlbnRseSB1c2VzIGBBcnJheS5wcm90b3R5cGUuc29ydGAgZGlyZWN0bHksIGFuZFxuICogc28gb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiBnaXZlbiBhIGBjb21wYXJlYCBmdW5jdGlvbiB0aGF0IGNvbnNpZGVyc1xuICogYHVuZGVmaW5lZGAgc3RyaWN0bHkgYmlnZ2VyIChgPmApIHRoYW4gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzXG4gKiBiZWNhdXNlIGBBcnJheS5wcm90b3R5cGUuc29ydGAgYml6YXJyZWx5IG1vdmVzIGFsbCBgdW5kZWZpbmVkYHMgdG9cbiAqIHRoZSBlbmQgb2YgdGhlIGFycmF5IHJlZ2FyZGxlc3MsIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgYGNvbXBhcmVgXG4gKiBmdW5jdGlvbi4gVGhpcyBpcyBhIGdlbnVpbmUgYnVnIGZvciB1cyBOT1cgYmVjYXVzZSBzb21ldGltZXMgd2Ugc29ydFxuICogaW4gcmV2ZXJzZSBvcmRlciBieSBwYXNzaW5nIGEgcmV2ZXJzZWQgcmFuayBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGU8UGFzc2FibGU+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtQYXNzYWJsZVtdfVxuICovXG5jb25zdCAgICAgICAgc29ydEJ5UmFuaz0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5pZihBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpe1xuaGFyZGVuKHBhc3NhYmxlcyk7XG4vKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbi8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbi8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuaWYoaXNSYW5rU29ydGVkKHBhc3NhYmxlcyxjb21wYXJlKSl7XG5yZXR1cm4gcGFzc2FibGVzO1xuIH1cbiB9XG5jb25zdCB1bnNvcnRlZD1bLi4ucGFzc2FibGVzXTtcbnVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbmNvbnN0IHNvcnRlZD1oYXJkZW4odW5zb3J0ZWQuc29ydChjb21wYXJlKSk7XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xucmV0dXJuIHNvcnRlZDtcbiB9OyRo4oCNX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaD0oc29ydGVkLGNvbXBhcmUsa2V5LGJpYXM9J2xlZnRNb3N0Jyk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xubGV0IGxlZnQ9MDtcbmxldCByaWdodD1zb3J0ZWQubGVuZ3RoO1xud2hpbGUobGVmdDxyaWdodCl7XG5jb25zdCBtPU1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpO1xuY29uc3QgY29tcD1jb21wYXJlKHNvcnRlZFttXSxrZXkpO1xuaWYoY29tcDw9LTF8fGNvbXA9PT0wJiZiaWFzPT09J3JpZ2h0TW9zdCcpe1xubGVmdD1tKzE7XG4gfWVsc2V7XG5hc3NlcnQoY29tcD49MXx8Y29tcD09PTAmJmJpYXM9PT0nbGVmdE1vc3QnKTtcbnJpZ2h0PW07XG4gfVxuIH1cbnJldHVybiBiaWFzPT09J2xlZnRNb3N0Jz9sZWZ0OnJpZ2h0LTE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRo4oCNX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjigI1fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuY29uc3QgICAgICAgIGNvdmVyZWRFbnRyaWVzPShzb3J0ZWQsW2xlZnRJbmRleCxyaWdodEluZGV4XSk9Pntcbi8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbmNvbnN0IGl0ZXJhYmxlPWhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9bGVmdEluZGV4O1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG5pZihpPD1yaWdodEluZGV4KXtcbmNvbnN0IGVsZW1lbnQ9c29ydGVkW2ldO1xuaSs9MTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOltpLGVsZW1lbnRdLGRvbmU6ZmFsc2V9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOnVuZGVmaW5lZCxkb25lOnRydWV9KTtcbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtYXhSYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKT49MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtaW5SYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKTw9MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgdW5pb25SYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCB1bmlvblJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWluUmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1heFJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpcixbJ3snLCcnXSk7XG4gfTskaOKAjV9vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgaW50ZXJzZWN0UmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5tYXhSYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWluUmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpcixbJycsJ3snXSk7XG4gfTskaOKAjV9vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbmNvbnN0ICAgICAgIHtjb21wYXJhdG9yOmNvbXBhcmVSYW5rLGFudGlDb21wYXJhdG9yOmNvbXBhcmVBbnRpUmFua309XG5tYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjigI1fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjigI1fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4vKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbi8qIGFzIHRoZSBNYXAuKi9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOBBOLPUVAAD1FQAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixhc3NlcnRQYXNzYWJsZSxmaWx0ZXJJdGVyYWJsZSxtYXBJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlNYXAsbWF0Y2hlcyxmaXQsYXNzZXJ0UGF0dGVybixtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXSxbXCJtYXBJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAobWFwSXRlcmFibGUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9hID0+IChtYWtlQ29weU1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtNYXA8SyxWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRLZXlPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IHRhZ1xuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG50YWc9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNtYXAua2V5cygpLFxuKGspPT5qc21hcC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG50YWcpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gdmFsdWVQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGl0ZXJhYmxlS2V5cztcbiB9XG5jb25zdCBmaWx0ZXI9KGspPT57XG5pZihrZXlQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhrLGtleVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuaWYodmFsdWVQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhqc21hcC5nZXQoayksdmFsdWVQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcbnJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsZmlsdGVyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybj19IGtleVBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybj19IHZhbHVlUGF0dFxuICogQHJldHVybnMge0l0ZXJhYmxlPFY+fVxuICovXG5jb25zdCB2YWx1ZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+LyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gdmFsdWVQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG5jb25zdCBlbnRyaWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9PltcbmssXG4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspXSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi9hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxudGFnKSxcblxua2V5cyxcbnZhbHVlcyxcbmVudHJpZXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYWtlQ29weU1hcChlbnRyaWVzKGtleVBhdHQsdmFsdWVQYXR0KSksXG5cbmdldFNpemU6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZD9cbmpzbWFwLnNpemU6XG5bLi4ua2V5cyhrZXlQYXR0LHZhbHVlUGF0dCldLmxlbmd0aCxcblxuY2xlYXI6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xuanNtYXAuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpKXtcbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVNYXBzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUga2V5XG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJNYXBTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3IE1hcCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdCh2YWx1ZSx2YWx1ZVNoYXBlLCdtYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnbWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANn8xvmsPAABrDwAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixmaWx0ZXJJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlTZXQsbWF0Y2hlcyxmaXQsYXNzZXJ0UGF0dGVybixtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1NldDxLPn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0ga2V5TmFtZVxuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNzZXQua2V5cygpLFxuKGspPT5qc3NldC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxua2V5TmFtZSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP1xuaXRlcmFibGVLZXlzOlxuZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLChrKT0+bWF0Y2hlcyhrLGtleVBhdHQpKTtcblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbmpzc2V0LFxuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbmtleU5hbWUpLFxuXG5cbmtleXMsXG5cbnZhbHVlczprZXlzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQpPT5tYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/anNzZXQuc2l6ZTpbLi4ua2V5cyhrZXlQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkKXtcbmpzc2V0LmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQpKXtcbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKJflbqYRAACmEQAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGZpdCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0ga2V5TmFtZVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBqc21hcC5oYXMoa2V5KTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrZXkpKTtcbiB9LFxuXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNtYXAuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihlbnRyaWVzKT0+e1xuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBlbnRyaWVzKXtcbi8qIERvbid0IGFzc2VydCB0aGF0IHRoZSBrZXkgZWl0aGVyIGRvZXMgb3IgZG9lcyBub3QgZXhpc3QuKi9cbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcFN0b3JlIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlczpcbiAqIHByaW1pdGl2ZXMgb3IgcmVtb3RhYmxlcy5cbiAqIE90aGVyIG1hcFN0b3JlcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcyBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtNYXAgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtNYXAgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXRcbiAqIGl0IHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIG1hcC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZVxuICogcmVtb3RhYmxlcywgc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyByZWFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnM9fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha01hcFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcobG9uZ0xpdmVkP1dlYWtNYXA6TWFwKSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdCh2YWx1ZSx2YWx1ZVNoYXBlLCd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiB9XG4gfTtcblxuY29uc3QgYXNzZXJ0S1ZPa1RvQWRkPShrZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG51bmRlZmluZWQsXG50YWcpfSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJSIAWZw0AAGcNAAA1AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsZml0LGFzc2VydFBhdHRlcm47JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7V2Vha1NldDxLICYgb2JqZWN0Pn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0ga2V5TmFtZVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzc2V0LmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgc2V0LiovXG5yZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gfSxcblxuYWRkOihrZXkpPT57XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooa2V5cyk9PntcbmZvcihjb25zdCBrZXkgb2Yga2V5cyl7XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtTZXQgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtTZXQgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXRcbiAqIGl0IHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIHNldC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZVxuICogcmVtb3RhYmxlcywgc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyBhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha1NldFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcobG9uZ0xpdmVkP1dlYWtTZXQ6U2V0KSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKlCtyDwTAAA8EwAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VDdXJyZW50S2V5c0tpdCIsInByb3ZpZGVMYXp5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEN1cnJlbnRLZXlzS2l0XG4gKiBAcHJvcGVydHkgeyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25BZGRcbiAqIEBwcm9wZXJ0eSB7KGs6IEspID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uRGVsZXRlXG4gKiBAcHJvcGVydHkge0l0ZXJhYmxlPEs+fSBpdGVyYWJsZUtleXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmFibGU8Sz59IGdldFJhd0tleXNcbiAqIEBwYXJhbSB7KGs6IEspID0+IGJvb2xlYW59IGNoZWNrSGFzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0geyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7Q3VycmVudEtleXNLaXQ8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDdXJyZW50S2V5c0tpdD0oXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xubGV0IHVwZGF0ZUNvdW50PTA7XG5sZXQgc29ydGVkS2V5c01lbW87XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkPShrLHY9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0T2tUb0FkZChrLHYpO1xudXBkYXRlQ291bnQrPTE7XG5zb3J0ZWRLZXlzTWVtbz11bmRlZmluZWQ7XG4gfTtcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGU9KGspPT5hc3NlcnRPa1RvRGVsZXRlJiZhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG5jb25zdCBnZXRTb3J0ZWRLZXlzPSgpPT57XG5pZihzb3J0ZWRLZXlzTWVtbz09PXVuZGVmaW5lZCl7XG5zb3J0ZWRLZXlzTWVtbz1oYXJkZW4oWy4uLmdldFJhd0tleXMoKV0uc29ydChjb21wYXJlKSk7XG4gfVxucmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuIH07XG5cbmNvbnN0IGl0ZXJhYmxlS2V5cz1GYXIoJ0l0ZXJhYmxlIG9mIGtleXMnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBnZW5lcmF0aW9uPXVwZGF0ZUNvdW50O1xuZ2V0U29ydGVkS2V5cygpO1xuY29uc3QgbGVuPXNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJyx7XG5uZXh0OigpPT57XG5hc3NlcnQuZXF1YWwoXG5nZW5lcmF0aW9uLFxudXBkYXRlQ291bnQsXG5YIGBTdG9yZSAke3Eoa2V5TmFtZSl9IGN1cnNvciBzdGFsZWApO1xuXG4vKiBJZiB0aGV5J3JlIGVxdWFsLCB0aGVuIHRoZSBzb3J0ZWRLZXlNZW1vIGlzIHRoZSBzYW1lIG9uZSovXG4vKiB3ZSBzdGFydGVkIHdpdGguKi9cbmZvcig7Oyl7XG5pZihpPGxlbil7XG5jb25zdCB2YWx1ZT1zb3J0ZWRLZXlzTWVtb1tpXTtcbmkrPTE7XG5pZihjaGVja0hhcyh2YWx1ZSkpe1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG4gfVxuIH19KTtcblxuIH19KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmFzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG5pdGVyYWJsZUtleXN9KTtcblxuIH07JGjigI1fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVMYXp5YCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SyxWPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlTGF6eT0obWFwU3RvcmUsa2V5LG1ha2VWYWx1ZSk9PntcbmlmKCFtYXBTdG9yZS5oYXMoa2V5KSl7XG5tYXBTdG9yZS5pbml0KGtleSxtYWtlVmFsdWUoa2V5KSk7XG4gfVxucmV0dXJuIG1hcFN0b3JlLmdldChrZXkpO1xuIH07JGjigI1fb25jZS5wcm92aWRlTGF6eShwcm92aWRlTGF6eSk7XG5oYXJkZW4ocHJvdmlkZUxhenkpO1xuXG4vKipcbiAqIEhlbHBlciBmb3IgdXNlIGNhc2VzIGluIHdoaWNoIHRoZSBtYWtlciBmdW5jdGlvbiBpcyBhc3luYy5cbiAqIEZvciB0d28gcHJvdmlkZUxhenkgY2FsbHMgd2l0aCB0aGUgc2FtZSBrZXksIG9uZSBtYXkgYmUgbWFraW5nIHdoZW4gdGhlXG4gKiBvdGhlciBjYWxsIHN0YXJ0cyBhbmQgaXQgd291bGQgbWFrZSBhZ2Fpbi5cbiAqIChUaGVuIHRoZXJlJ2QgYmUgYSBjb2xsaXNpb24gd2hlbiB0aGUgc2Vjb25kIHRyaWVzIHRvIHN0b3JlXG4gKiB0aGUga2V5LikgVGhpcyBwcmV2ZW50cyB0aGF0IHJhY2UgY29uZGl0aW9uIGJ5IGltbWVkaWF0ZWx5IHN0b3JpbmcgYSBQcm9taXNlXG4gKiBmb3IgdGhlIG1ha2VyIGluIGFuIGVwaGVtZXJhbCBzdG9yZS5cbiAqXG4gKiBXaGVuIHRoZSBgc3RvcmVgIGFyZ3VtZW50IGlzIGR1cmFibGUgc3RvcmFnZSwgbm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yXG4gKiB0ZXJtaW5hdGlvbiB0byBoYXBwZW4gYWZ0ZXIgdGhlIG1ha2UgY29tcGxldGVzIGFuZCBiZWZvcmUgaXQgcmVhY2hlcyBkdXJhYmxlXG4gKiBzdG9yYWdlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IHN0b3JlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXRvbWljUHJvdmlkZXI9KHN0b3JlKT0+e1xuLyoqIEB0eXBlIHtNYXA8SywgUHJvbWlzZTxWPj59ICovXG5jb25zdCBwZW5kaW5nPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlQXN5bmNgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSxcbiAqIHdoZW4gdGhlIG1ha2VyIGlzIGFzeW5jaHJvbm91cy5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZVxuICogaWYgaXQgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgdGhlIGxhc3QgbWFrZSBmYWlsZWRcbiAqIEBwYXJhbSB7KGtleTogSywgdmFsdWU6IFYpID0+IFByb21pc2U8dm9pZD59IFtmaW5pc2hWYWx1ZV0gcnVucyBleGFjdGx5XG4gKiBvbmNlIGFmdGVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBzdG9yZVxuICogQHJldHVybnMge1Byb21pc2U8Vj59XG4gKi9cbmNvbnN0IHByb3ZpZGVBc3luYz0oa2V5LG1ha2VWYWx1ZSxmaW5pc2hWYWx1ZSk9PntcbmlmKHN0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuIH1cbmlmKCFwZW5kaW5nLmhhcyhrZXkpKXtcbmNvbnN0IHZhbFA9bWFrZVZhbHVlKGtleSkuXG50aGVuKCh2KT0+e1xuc3RvcmUuaW5pdChrZXksdik7XG5yZXR1cm4gdjtcbiB9KS5cbnRoZW4oKHYpPT57XG5pZihmaW5pc2hWYWx1ZSl7XG5yZXR1cm4gZmluaXNoVmFsdWUoa2V5LHYpLnRoZW4oKCk9PnYpO1xuIH1cbnJldHVybiB2O1xuIH0pLlxuZmluYWxseSgoKT0+e1xucGVuZGluZy5kZWxldGUoa2V5KTtcbiB9KTtcbnBlbmRpbmcuc2V0KGtleSx2YWxQKTtcbiB9XG5jb25zdCB2YWxQPXBlbmRpbmcuZ2V0KGtleSk7XG5hc3NlcnQodmFsUCk7XG5yZXR1cm4gdmFsUDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtwcm92aWRlQXN5bmN9KTtcbiB9OyRo4oCNX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZUF0b21pY1Byb3ZpZGVyPEssIFY+Pn0gQXRvbWljUHJvdmlkZXI8SywgVj5cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/IEqgRHUAAER1AAAhAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVRhZ2dlZH0gQ29weVRhZ2dlZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IEtleVxuICogS2V5cyBhcmUgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZXMgKENvcHlBcnJheSwgQ29weVJlY29yZCxcbiAqIENvcHlTZXQsIENvcHlCYWcsIENvcHlNYXApIHRoYXQgZW5kIGluIGVpdGhlciBwYXNzYWJsZSBwcmltaXRpdmUgZGF0YSBvclxuICogUmVtb3RhYmxlcyAoRmFyIG9iamVjdHMgb3IgdGhlaXIgcmVtb3RlIHByZXNlbmNlcy4pIEtleXMgYXJlIHNvIG5hbWVkXG4gKiBiZWNhdXNlIHRoZXkgY2FuIGJlIHVzZWQgYXMga2V5cyBpbiBNYXBTdG9yZXMgYW5kIENvcHlNYXBzLCBhcyB3ZWxsIGFzXG4gKiB0aGUgZWxlbWVudHMgb2YgQ29weVNldHMgYW5kIENvcHlCYWdzLlxuICpcbiAqIEtleXMgY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLCBhcyB0aGVzZSBkbyBub3QgaGF2ZSBhIHVzZWZ1bFxuICogZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLiBLZXlzIGFsc28gY2Fubm90IGNvbnRhaW4gYW55IENvcHlUYWdnZWRcbiAqIGV4Y2VwdCBmb3IgdGhvc2UgcmVjb2duaXplZCBhcyBDb3B5U2V0cywgQ29weUJhZ3MsIGFuZCBDb3B5TWFwcy5cbiAqXG4gKiBCZSBhd2FyZSB0aGF0IHdlIG1heSByZWNvZ25pemUgbW9yZSBDb3B5VGFnZ2VkcyBvdmVyIHRpbWUsIGluY2x1ZGluZ1xuICogQ29weVRhZ2dlZHMgcmVjb2duaXplZCBhcyBrZXlzLlxuICpcbiAqIERpc3RyaWJ1dGVkIGVxdWFsaXR5IGlzIGxvY2F0aW9uIGluZGVwZW5kZW50LlxuICogVGhlIHNhbWUgdHdvIGtleXMsIHBhc3NlZCB0byBhbm90aGVyIGxvY2F0aW9uLCB3aWxsIGJlIGBrZXlFUWAgdGhlcmUgaWZmXG4gKiB0aGV5IGFyZSBga2V5RVFgIGhlcmUuIChga2V5RVFgIHRlc3RzIGVxdWFsaXR5IGFjY29yZGluZyB0byB0aGVcbiAqIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBQYXR0ZXJuXG4gKiBQYXR0ZXJucyBhcmUgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZXMgKENvcHlBcnJheSwgQ29weVJlY29yZCxcbiAqIENvcHlTZXQsIENvcHlCYWcsIENvcHlNYXApIHRoYXQgZW5kIGluIGVpdGhlciBLZXlzIG9yIE1hdGNoZXJzLiBFYWNoIHBhdHRlcm5cbiAqIGFjdHMgYXMgYSBkZWNsYXJhdGl2ZSBwYXNzYWJsZSBwcmVkaWNhdGUgb3ZlciBwYXNzYWJsZXMsIHdoZXJlIGVhY2ggcGFzc2FibGVcbiAqIGVpdGhlciBwYXNzZXMgYSBnaXZlbiBwYXR0ZXJuLCBvciBkb2VzIG5vdC4gRXZlcnkga2V5IGlzIGFsc28gYSBwYXR0ZXJuLlxuICogVXNlZCBhcyBhIHBhdHRlcm4sIGEga2V5IG1hdGNoZXMgb25seSBcIml0c2VsZlwiLCBpLmUuLCBrZXlzIHRoYXQgYXJlXG4gKiBga2V5RVFgIHRvIGl0LCB0aGF0IGlzLCBlcXVhbCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLlxuICpcbiAqIFBhdHRlcm5zIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG9cbiAqIG5vdCBoYXZlIGEgdXNlZnVsIGRpc3RyaWJ1dGVkIGVxdWFsaXR5IG9yIG1hdGNoaW5nIHNlbWFudGljcy4gTGlrZXdpc2UsXG4gKiBubyBwYXR0ZXJuIGNhbiBkaXN0aW5ndWlzaCBhbW9uZyBwcm9taXNlcywgb3IgZGlzdGluZ3Vpc2ggYW1vbmcgZXJyb3JzLlxuICogUGF0dGVybnMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZHMgZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzXG4gKiBDb3B5U2V0cywgQ29weUJhZ3MsIENvcHlNYXBzLCBvciBNYXRjaGVycy5cbiAqXG4gKiBCZSBhd2FyZSB0aGF0IHdlIG1heSByZWNvZ25pemUgbW9yZSBDb3B5VGFnZ2VkcyBvdmVyIHRpbWUsIGluY2x1ZGluZ1xuICogQ29weVRhZ2dlZHMgcmVjb2duaXplZCBhcyBwYXR0ZXJucy5cbiAqXG4gKiBXaGV0aGVyIGEgcGFzc2FibGUgbWF0Y2hlcyBhIGdpdmVuIHBhdHRlcm4gaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBGb3IgYSBwYXNzYWJsZSBhbmQgYSBwYXR0ZXJuLCBib3RoIHBhc3NlZCB0byBhbm90aGVyIGxvY2F0aW9uLCB0aGUgcGFzc2FibGVcbiAqIHdpbGwgbWF0Y2ggdGhlIHBhdHRlcm4gdGhlcmUgaWZmIHRoZSBwYXNzYWJsZSBtYXRjaGVzIHRoYXQgcGF0dGVybiBoZXJlLlxuICpcbiAqIFBhdHRlcm5zIGFyZSBvZnRlbiB1c2VkIGluIGEgdHlwZS1saWtlIG1hbm5lciwgdG8gcmVwcmVzZW50IHRoZSBjYXRlZ29yeVxuICogb2YgcGFzc2FibGVzIHRoYXQgYXJlIGludGVuZGVkKiB0byBtYXRjaCB0aGF0IHBhdHRlcm4uIFRvIGtlZXAgdGhpc1xuICogZGlzdGluY3Rpb24gY2xlYXIsIHdlIG9mdGVuIHVzZSB0aGUgc3VmZml4IFwiU2hhcGVcIiByYXRoZXIgdGhhbiBcIlBhdHRlcm5cIlxuICogdG8gYXZvaWQgdGhlIGxldmVscyBjb25mdXNpb24gd2hlbiB0aGUgcGF0dGVybiBpdHNlbGYgcmVwcmVzZW50c1xuICogc29tZSBjYXRlZ29yeSBvZiBwYXR0ZXJuLiBGb3IgZXhhbXBsZSwgYW4gXCJBbW91bnRTaGFwZVwiIHJlcHJlc2VudHMgdGhlXG4gKiBjYXRlZ29yeSBvZiBBbW91bnRzLiBBbmQgXCJBbW91bnRQYXR0ZXJuU2hhcGVcIiByZXByZXNlbnRzIHRoZVxuICogY2F0ZWdvcnkgb2YgcGF0dGVybnMgb3ZlciBBbW91bnRzLlxuICpcbiAqICogSSBzYXkgXCJpbnRlbmRlZFwiIGFib3ZlIGJlY2F1c2UgUGF0dGVybnMsIGluIG9yZGVyIHRvIGJlIGRlY2xhcmF0aXZlXG4gKiBhbmQgcGFzc2FibGUsIGNhbm5vdCBoYXZlIHRoZSBnZW5lcmFsaXR5IG9mIHByZWRpY2F0ZXMgd3JpdHRlbiBpbiBhXG4gKiBUdXJpbmctdW5pdmVyc2FsIHByb2dyYW1taW5nIGxhbmd1YWdlLiBSYXRoZXIsIHRvIHJlcHJlc2VudCB0aGUgY2F0ZWdvcnkgb2ZcbiAqIHRoaW5ncyBpbnRlbmRlZCB0byBiZSBhIEZvbywgYSBGb29TaGFwZSBzaG91bGQgcmVsaWFibHlcbiAqIGFjY2VwdCBhbGwgRm9vcyBhbmQgcmVqZWN0IG9ubHkgbm9uLUZvb3MuIEhvd2V2ZXIsIGEgRm9vU2hhcGUgbWF5IGFsc28gYWNjZXB0XG4gKiBub24tRm9vcyB0aGF0IFwibG9vayBsaWtlXCIgb3IgaGF2ZSBcInRoZSBzYW1lIHNoYXBlIGFzXCIgZ2VudWluZSBGb29zLiBUbyB3cml0ZVxuICogYXMgYWNjdXJhdGUgcHJlZGljYXRlLCBmb3IgdXNlLCBmb3IgZXhhbXBsZSwgZm9yIGlucHV0IHZhbGlkYXRpb24sIHdvdWxkXG4gKiBuZWVkIHRvIHN1cHBsZW1lbnQgdGhlIHBhdHRlcm4gY2hlY2sgd2l0aCBjb2RlIHRvIGNoZWNrIGZvciB0aGUgcmVzaWR1YWxcbiAqIGNhc2VzLlxuICogV2UgaG9wZSB0aGUgXCJTaGFwZVwiIG1ldGFwaG9yIGhlbHBzIHJlbWluZCB1cyBvZiB0aGlzIHR5cGUtbGlrZSBpbXByZWNpc2lvblxuICogb2YgcGF0dGVybnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IENvcHlTZXRcbiAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSBDb3B5VGFnZ2VkIHNvIHRoaXMgY2FuIGluY2x1ZGUgaXQqL1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZztcbiAqICAgcGF5bG9hZDogQXJyYXk8W0ssIGJpZ2ludF0+O1xuICogfX0gQ29weUJhZ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IENvcHlNYXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkfSBNYXRjaGVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtQYXR0ZXJuPX0ga2V5U2hhcGVcbiAqIEBwcm9wZXJ0eSB7UGF0dGVybj19IHZhbHVlU2hhcGVcbiAqL1xuXG4vKipcbiAqIE1vc3Qgc3RvcmUgbWV0aG9kcyBhcmUgaW4gb25lIG9mIHRocmVlIGNhdGVnb3JpZXNcbiAqICAgKiBsb29rdXAgbWV0aG9kcyAoYGhhc2AsYGdldGApXG4gKiAgICogdXBkYXRlIG1ldGhvZHMgKGBhZGRgLGBpbml0YCxgc2V0YCxgZGVsZXRlYCxgYWRkQWxsYClcbiAqICAgKiBxdWVyeSBtZXRob2RzIChgc25hcHNob3RgLGBrZXlzYCxgdmFsdWVzYCxgZW50cmllc2AsYGdldFNpemVgKVxuICogICAqIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzIChgY2xlYXJgKVxuICpcbiAqIFdlYWtTdG9yZXMgaGF2ZSB0aGUgbG9va3VwIGFuZCB1cGRhdGUgbWV0aG9kcyBidXQgbm90IHRoZSBxdWVyeVxuICogb3IgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKiBOb24td2VhayBTdG9yZXMgYXJlIGxpa2UgdGhlaXIgY29ycmVzcG9uZGluZyBXZWFrU3RvcmUsIGJ1dCB3aXRoIHRoZVxuICogYWRkaXRpb25hbCBxdWVyeSBhbmQgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge29iamVjdH0gV2Vha1NldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gQ29weVNldDxLPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha01hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgbWFwXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBrZXlQYXR0PzogUGF0dGVybixcbiAqICAgdmFsdWVQYXR0PzogUGF0dGVyblxuICogKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5TWFwPEssVj59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERlcHJlY2F0ZWQgTGVnYWN5IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge1dlYWtNYXBTdG9yZTxLLFY+fSBXZWFrU3RvcmVcbiAqIERlcHJlY2F0ZWQgdHlwZSBuYW1lIGBXZWFrU3RvcmVgLiBVc2UgYFdlYWtNYXBTdG9yZWAgaW5zdGVhZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtNYXBTdG9yZTxLLFY+fSBTdG9yZVxuICogRGVwcmVjYXRlZCB0eXBlIG5hbWUgYFN0b3JlYC4gVXNlIGBNYXBTdG9yZWAgaW5zdGVhZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeVdlYWtNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeU1hcFxuICogTGVnYWN5V2Vha01hcCBpcyBkZXByZWNhdGVkLiBVc2UgV2Vha01hcFN0b3JlIGluc3RlYWQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFtLLFZdPn0gZW50cmllc1xuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYgey0xIHwgMCB8IDF9IFJhbmtDb21wYXJpc29uXG4gKiBUaGUgcmVzdWx0IG9mIGEgYFJhbmtDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSByYW5rLW9yZGVyLCBpLmUuLFxuICogYSB0b3RhbCBwcmVvcmRlciBpbiB3aGljaCBkaWZmZXJlbnQgZWxlbWVudHMgYXJlIGFsd2F5cyBjb21wYXJhYmxlIGJ1dFxuICogY2FuIGJlIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuIFNlZSBgUmFua0NvbXBhcmVgLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJhbmtDb21wYXJlXG4gKiBSZXR1cm5zIGAtMWAsIGAwYCwgb3IgYDFgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByYW5rIG9mIGBsZWZ0YFxuICogaXMgYmVmb3JlLCB0aWVkLXdpdGgsIG9yIGFmdGVyIHRoZSByYW5rIG9mIGByaWdodGAuXG4gKlxuICogVGhpcyBjb21wYXJpc29uIGZ1bmN0aW9uIGlzIHZhbGlkIGFzIGFyZ3VtZW50IHRvXG4gKiBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIGlzIHNvbWV0aW1lcyBkZXNjcmliZWQgYXMgYSBcInRvdGFsIG9yZGVyXCJcbiAqIGJ1dCwgZGVwZW5kaW5nIG9uIHlvdXIgZGVmaW5pdGlvbnMsIHRoaXMgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0IGJlY2F1c2VcbiAqIGl0IG1heSByZXR1cm4gYDBgIHRvIGluZGljYXRlIHRoYXQgdHdvIGRpc3Rpbmd1aXNoYWJsZSBlbGVtZW50cyBzdWNoIGFzXG4gKiBgLTBgIGFuZCBgMGAgYXJlIHRpZWQgKGkuZS4sIGFyZSBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzc1xuICogZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIG9yZGVyaW5nKS4gSWYgZWFjaCBzdWNoIGVxdWl2YWxlbmNlIGNsYXNzIGlzXG4gKiBhICpyYW5rKiBhbmQgcmFua3MgYXJlIGRpc2pvaW50LCB0aGVuIHRoaXMgXCJyYW5rIG9yZGVyXCIgaXMgYVxuICogdHJ1ZSB0b3RhbCBvcmRlciBvdmVyIHRoZXNlIHJhbmtzLiBJbiBtYXRoZW1hdGljcyB0aGlzIGdvZXMgYnkgc2V2ZXJhbFxuICogb3RoZXIgbmFtZXMgc3VjaCBhcyBcInRvdGFsIHByZW9yZGVyXCIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBlc3RhYmxpc2hlcyBhIHRvdGFsIHJhbmsgb3JkZXIgb3ZlciBhbGwgcGFzc2FibGVzLlxuICogVG8gZG8gc28gaXQgbWFrZXMgYXJiaXRyYXJ5IGNob2ljZXMsIHN1Y2ggYXMgdGhhdCBhbGwgc3RyaW5nc1xuICogYXJlIGFmdGVyIGFsbCBudW1iZXJzLiBUaHVzLCB0aGlzIG9yZGVyIGlzIG5vdCBpbnRlbmRlZCB0byBiZVxuICogdXNlZCBkaXJlY3RseSBhcyBhIGNvbXBhcmlzb24gd2l0aCB1c2VmdWwgc2VtYW50aWNzLiBIb3dldmVyLCBpdCBtdXN0IGJlXG4gKiBjbG9zZWx5IGVub3VnaCByZWxhdGVkIHRvIHN1Y2ggY29tcGFyaXNvbnMgdG8gYWlkIGluIGltcGxlbWVudGluZ1xuICogbG9va3VwcyBiYXNlZCBvbiB0aG9zZSBjb21wYXJpc29ucy4gRm9yIGV4YW1wbGUsIGluIG9yZGVyIHRvIGdldCBhIHRvdGFsXG4gKiBvcmRlciBhbW9uZyByYW5rcywgd2UgcHV0IGBOYU5gIGFmdGVyIGFsbCBvdGhlciBKYXZhU2NyaXB0IFwibnVtYmVyXCIgdmFsdWVzXG4gKiAoaS5lLiwgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgdmFsdWVzKS4gQnV0IG90aGVyd2lzZSwgd2UgcmFuayBKYXZhU2NyaXB0XG4gKiBudW1iZXJzIGJ5IHNpZ25lZCBtYWduaXR1ZGUsIHdpdGggYDBgIGFuZCBgLTBgIHRpZWQuIEEgc2VtYW50aWNhbGx5IHVzZWZ1bFxuICogb3JkZXJpbmcgd291bGQgYWxzbyBjb21wYXJlIG1hZ25pdHVkZXMsIGFuZCBzbyBhZ3JlZSB3aXRoIHRoZSByYW5rIG9yZGVyaW5nXG4gKiBvZiBhbGwgdmFsdWVzIG90aGVyIHRoYW4gYE5hTmAuIEFuIGFycmF5IHNvcnRlZCBieSByYW5rIHdvdWxkIGVuYWJsZSByYW5nZVxuICogcXVlcmllcyBieSBtYWduaXR1ZGUuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBsZWZ0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JhbmtDb21wYXJlfSBGdWxsQ29tcGFyZVxuICogQSBgRnVsbENvbXBhcmVgIGZ1bmN0aW9uIHNhdGlzZmllcyBhbGwgdGhlIGludmFyaWFudHMgc3RhdGVkIGJlbG93IGZvclxuICogYFJhbmtDb21wYXJlYCdzIHJlbGF0aW9uIHdpdGggS2V5Q29tcGFyZS5cbiAqIEluIGFkZGl0aW9uLCBpdHMgZXF1YWxpdHkgaXMgYXMgcHJlY2lzZSBhcyB0aGUgYEtleUNvbXBhcmVgXG4gKiBjb21wYXJpc29uIGRlZmluZWQgYmVsb3csIGluIHRoYXQsIGZvciBhbGwgS2V5cyBgeGAgYW5kIGB5YCxcbiAqIGBGdWxsQ29tcGFyZSh4LCB5KSA9PT0gMGAgaWZmIGBLZXlDb21wYXJlKHgsIHkpID09PSAwYC5cbiAqXG4gKiBGb3Igbm9uLWtleXMgYSBgRnVsbENvbXBhcmVgIHNob3VsZCBiZSBleGFjdGx5IGFzIGltcHJlY2lzZSBhc1xuICogYFJhbmtDb21wYXJlYC4gRm9yIGV4YW1wbGUsIGJvdGggd2lsbCB0cmVhdCBhbGwgZXJyb3JzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIHRyZWF0IGFsbCBwcm9taXNlcyBhcyBpbiB0aGUgc2FtZVxuICogZXF1aXZhbGVuY2UgY2xhc3MuIEJvdGggd2lsbCBvcmRlciB0YWdnZWRzIHRoZSBzYW1lIHdheSwgd2hpY2ggaXMgYWRtaXR0ZWRseVxuICogd2VpcmQsIGFzIHNvbWUgdGFnZ2VkcyB3aWxsIGJlIGNvbnNpZGVyZWQga2V5cyBhbmQgb3RoZXIgdGFnZ2VkcyB3aWxsIGJlXG4gKiBjb25zaWRlcmVkIG5vbi1rZXlzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHstMSB8IDAgfCAxIHwgTmFOfSBLZXlDb21wYXJpc29uXG4gKiBUaGUgcmVzdWx0IG9mIGEgYEtleUNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIG1lYW5pbmdmdWxcbiAqIGFuZCBtZWFuaW5nZnVsbHkgcHJlY2lzZSBwYXJ0aWFsIG9yZGVyIG9mIGBLZXlgIHZhbHVlcy4gU2VlIGBLZXlDb21wYXJlYC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBLZXlDb21wYXJlXG4gKiBgY29tcGFyZUtleXNgIGltcGxlbWVudHMgYSBwYXJ0aWFsIG9yZGVyIG92ZXIga2V5cy4gQXMgd2l0aCB0aGVcbiAqIHJhbmsgb3JkZXJpbmcgcHJvZHVjZWQgYnkgYGNvbXBhcmVSYW5rYCwgLTEsIDAsIGFuZCAxIG1lYW5cbiAqIFwibGVzcyB0aGFuXCIsIFwiZXF1aXZhbGVudCB0b1wiLCBhbmQgXCJncmVhdGVyIHRoYW5cIiByZXNwZWN0aXZlbHkuXG4gKiBOYU4gbWVhbnMgXCJpbmNvbXBhcmFibGVcIiAtLS0gdGhlIGZpcnN0IGtleSBpcyBub3QgbGVzcywgZXF1aXZhbGVudCxcbiAqIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLiBGb3IgZXhhbXBsZSwgc3Vic2V0cyBvdmVyIHNldHMgaXNcbiAqIGEgcGFydGlhbCBvcmRlci5cbiAqXG4gKiBCeSB1c2luZyBOYU4gZm9yIFwiaW5jb21wYXJhYmxlXCIsIHRoZSBub3JtYWwgZXF1aXZhbGVuY2UgZm9yIHVzaW5nXG4gKiB0aGUgcmV0dXJuIHZhbHVlIGluIGEgY29tcGFyaXNvbiBpcyBwcmVzZXJ2ZWQuXG4gKiBgY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID49IDBgIGlmZiBgbGVmdGAgaXMgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVpdmFsZW50IHRvIGByaWdodGAgaW4gdGhlIHBhcnRpYWwgb3JkZXJpbmcuXG4gKlxuICogS2V5IG9yZGVyIChhIHBhcnRpYWwgb3JkZXIpIGFuZCByYW5rIG9yZGVyIChhIHRvdGFsIHByZW9yZGVyKSBhcmVcbiAqIGNvLWRlc2lnbmVkIHNvIHRoYXQgd2Ugc3RvcmUgcGFzc2FibGVzIGluIHJhbmsgb3JkZXIgYW5kIGluZGV4IGludG8gdGhlbVxuICogd2l0aCBrZXlzIGZvciBrZXktYmFzZWQgcXVlcmllcy4gVG8ga2VlcCB0aGVzZSBkaXN0aW5jdCwgd2hlbiBzcGVha2luZ1xuICogaW5mb3JtYWxseSBhYm91dCByYW5rLCB3ZSB0YWxrIGFib3V0IFwiZWFybGllclwiIGFuZCBcImxhdGVyXCIuIFdoZW4gc3BlYWtpbmdcbiAqIGluZm9ybWFsbHkgYWJvdXQga2V5cywgd2UgdGFsayBhYm91dCBcInNtYWxsZXJcIiBhbmQgXCJiaWdnZXJcIi5cbiAqXG4gKiBJbiBib3RoIG9yZGVycywgdGhlIHJldHVybi0wIGNhc2UgZGVmaW5lc1xuICogYW4gZXF1aXZhbGVuY2UgY2xhc3MsIGkuZS4sIHRob3NlIHRoYXQgYXJlIHRpZWQgZm9yIHRoZSBzYW1lIHBsYWNlIGluIHRoZVxuICogb3JkZXIuIFRoZSBnbG9iYWwgaW52YXJpYW50IHRoYXQgd2UgbmVlZCBiZXR3ZWVuIHRoZSB0d28gb3JkZXJzIGlzIHRoYXQgdGhlXG4gKiBrZXkgb3JkZXIgZXF1aXZhbGVuY2UgY2xhc3MgaXMgYWx3YXlzIGF0IGxlYXN0IGFzIHByZWNpc2UgYXMgdGhlXG4gKiByYW5rIG9yZGVyIGVxdWl2YWxlbmNlIGNsYXNzLiBJT1csIGlmIGBjb21wYXJlS2V5cyhYLFkpID09PSAwYCB0aGVuXG4gKiBgY29tcGFyZVJhbmsoWCxZKSA9PT0gMGAuIEJ1dCBub3QgdmljZSB2ZXJzYS4gRm9yIGV4YW1wbGUsIHR3byBkaWZmZXJlbnRcbiAqIHJlbW90YWJsZXMgYXJlIHRoZSBzYW1lIHJhbmsgYnV0IGluY29tcGFyYWJsZSBhcyBrZXlzLlxuICpcbiAqIEEgZnVydGhlciBpbnZhcmlhbnQgaXMgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPCAwYCB0aGVuXG4gKiBgY29tcGFyZVJhbmsoWCxZKSA8IDBgLCBpLmUuLCBpZiBYIGlzIHNtYWxsZXIgdGhhbiBZIGluIGtleSBvcmRlciwgdGhlbiBYXG4gKiBtdXN0IGJlIGVhcmxpZXIgdGhhbiBZIGluIHJhbmsgb3JkZXIuIEJ1dCBub3QgdmljZSB2ZXJzYS5cbiAqIFggY2FuIGJlIGVxdWl2YWxlbnQgdG8gb3IgZWFybGllciB0aGFuIFkgaW4gcmFuayBvcmRlciBhbmQgc3RpbGwgYmVcbiAqIGluY29tcGFyYWJsZSB3aXRoIFkgaW4ga2V5IG9yZGVyLiBGb3IgZXhhbXBsZSwgdGhlIHJlY29yZCBge2I6IDMsIGE6IDV9YCBpc1xuICogZWFybGllciB0aGFuIHRoZSByZWNvcmQgYHtiOiA1LCBhOiAzfWAgaW4gcmFuayBvcmRlciBidXQgdGhleSBhcmVcbiAqIGluY29tcGFyYWJsZSBhcyBrZXlzLiBBbmQgdHdvIGRpc3RpbmN0IHJlbW90YWJsZXMgc3VjaCBhcyBgRmFyKCdYJywge30pYCBhbmRcbiAqIGBGYXIoJ1knLCB7fSlgIGFyZSBlcXVpdmFsZW50IGluIHJhbmsgb3JkZXIgYnV0IGluY29tcGFyYWJsZSBhcyBrZXlzLlxuICpcbiAqIFRoaXMgbGV0cyB1cyB0cmFuc2xhdGUgYSByYW5nZSBzZWFyY2ggb3ZlciB0aGVcbiAqIHBhcnRpYWwga2V5IG9yZGVyIGludG8gYSByYW5nZSBzZWFyY2ggb3ZlciByYW5rIG9yZGVyIGZvbGxvd2VkIGJ5IGZpbHRlcmluZ1xuICogb3V0IHRob3NlIHRoYXQgZG9uJ3QgbWF0Y2guIFRvIGdldCB0aGlzIGVmZmVjdCwgd2Ugc3RvcmUgdGhlIGVsZW1lbnRzIG9mXG4gKiBhIHNldCBpbiBhbiBhcnJheSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyLCBmcm9tIGxhdGVyIHRvIGVhcmxpZXIuXG4gKiBDb21iaW5lZCB3aXRoIG91ciBsZXhpY29ncmFwaGljIGNvbXBhcmlzb24gb2YgYXJyYXlzLCBpZiBzZXQgWCBpcyBhIHN1YnNldFxuICogb2Ygc2V0IFkgdGhlbiB0aGUgYXJyYXkgcmVwcmVzZW50aW5nIHNldCBYIHdpbGwgYmUgYW4gZWFybGllciByYW5rIHRoYXQgdGhlXG4gKiBhcnJheSByZXByZXNlbnRpbmcgc2V0IFkuXG4gKlxuICogQHBhcmFtIHtLZXl9IGxlZnRcbiAqIEBwYXJhbSB7S2V5fSByaWdodFxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFNob3VsZCBiZSBpbnRlcm5hbCBvbmx5IHR5cGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbc3RyaW5nLCBzdHJpbmddfSBSYW5rQ292ZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UGFzc1N0eWxlQ292ZXJcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbmRleENvdmVyXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ292ZXJlZEVudHJpZXNcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENoZWNrUGF0dGVyblxuICogQHBhcmFtIHtQYXNzYWJsZX0gYWxsZWdlZFBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENoZWNrS2V5UGF0dGVyblxuICogQHBhcmFtIHtQYXNzYWJsZX0gYWxsZWdlZFBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEtleVRvREJLZXlcbiAqIElmIHRoaXMga2V5IGNhbiBiZSBlbmNvZGVkIGFzIGEgREJLZXkgc3RyaW5nIHdoaWNoIHNvcnRzIGNvcnJlY3RseSxcbiAqIHJldHVybiB0aGF0IHN0cmluZy4gRWxzZSByZXR1cm4gYHVuZGVmaW5lZGAuIEZvciBleGFtcGxlLCBhIHNjYWxhci1vbmx5XG4gKiBlbmNvZGVQYXNzYWJsZSB3b3VsZCByZXR1cm4gYHVuZGVmaW5lZGAgZm9yIGFsbCBub24tc2NhbGFyIGtleXMuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFJhbmtDb3ZlclxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0ZXJuXG4gKiBAcGFyYW0ge0tleVRvREJLZXl9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWxsTGltaXRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVjaW1hbERpZ2l0c0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3RyaW5nTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzeW1ib2xOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1Qcm9wZXJ0aWVzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFycmF5TGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1TZXRFbGVtZW50c0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bU1hcEVudHJpZXNMaW1pdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1BhcnRpYWw8QWxsTGltaXRzPn0gTGltaXRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaGVyTmFtZXNwYWNlXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGFueVxuICogTWF0Y2hlcyBhbnkgcGFzc2FibGVcbiAqIEBwcm9wZXJ0eSB7KC4uLnBhdHRzOiBQYXR0ZXJuW10pID0+IE1hdGNoZXJ9IGFuZFxuICogT25seSBpZiBpdCBtYXRjaGVzIGFsbCB0aGUgc3ViLXBhdHRlcm5zXG4gKiBAcHJvcGVydHkgeyguLi5wYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBvclxuICogT25seSBpZiBpdCBtYXRjaGVzIGF0IGxlYXN0IG9uZSBzdWJQYXR0ZXJuXG4gKiBAcHJvcGVydHkgeyhzdWJQYXR0OiBQYXR0ZXJuKSA9PiBNYXRjaGVyfSBub3RcbiAqIE9ubHkgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIHN1Yi1wYXR0ZXJuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBzY2FsYXJcbiAqIFRoZSBzY2FsYXJzIGFyZSB0aGUgcHJpbWl0aXZlIHZhbHVlcyBhbmQgUmVtb3RhYmxlcy5cbiAqIEFsbCBzY2FsYXJzIGFyZSBrZXlzLlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBrZXlcbiAqIENhbiBiZSBpbiBhIGNvcHlTZXQgb3IgQ29weUJhZywgb3IgdGhlIGtleSBpbiBhIENvcHlNYXAuXG4gKiAoV2lsbCBldmVudHVhbGx5IGJlIGFibGUgdG8gYSBrZXkgaXMgYSBNYXBTdG9yZS4pXG4gKiBBbGwga2V5cyBhcmUgcGF0dGVybnMgdGhhdCBtYXRjaCBvbmx5IHRoZW1zZWx2ZXMuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHBhdHRlcm5cbiAqIElmIGl0IG1hdGNoZXMgTS5wYXR0ZXJuKCksIHRoZSBpdCBpcyBpdHNlbGYgYSBwYXR0ZXJuIHVzZWRcbiAqIHRvIG1hdGNoIG90aGVyIHBhc3NhYmxlcy4gQSBwYXR0ZXJuIGNhbm5vdCBjb250YWluIGVycm9yc1xuICogb3IgcHJvbWlzZXMsIGFzIHRoZXNlIGFyZSBub3Qgc3RhYmxlIGVub3VnaCB0byB1c2VmdWxseSBtYXRjaC5cbiAqIEBwcm9wZXJ0eSB7KGtpbmQ6IHN0cmluZykgPT4gTWF0Y2hlcn0ga2luZFxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBib29sZWFuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IG51bWJlciBPbmx5IGZsb2F0aW5nIHBvaW50IG51bWJlcnNcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmlnaW50XG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IG5hdFxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3ltYm9sXG4gKiBPbmx5IHJlZ2lzdGVyZWQgYW5kIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGVcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gcmVjb3JkIEEgQ29weVJlY29yZFxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBhcnJheSBBIENvcHlBcnJheVxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzZXQgQSBDb3B5U2V0XG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGJhZyBBIENvcHlCYWdcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gbWFwIEEgQ29weU1hcFxuICogQHByb3BlcnR5IHsobGFiZWw/OiBzdHJpbmcpID0+IE1hdGNoZXJ9IHJlbW90YWJsZVxuICogQSBmYXIgb2JqZWN0IG9yIGl0cyByZW1vdGUgcHJlc2VuY2UuIFRoZSBvcHRpb25hbCBgbGFiZWxgIGlzIHB1cmVseSBmb3JcbiAqIGRpYWdub3N0aWMgcHVycG9zZS4gSXQgZG9lcyBub3QgZW5mb3JjZSBhbnkgY29uc3RyYWludCBiZXlvbmQgdGhlXG4gKiBtdXN0LWJlLWEtcmVtb3RhYmxlIGNvbnN0cmFpbnQuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGVycm9yXG4gKiBFcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSwgYnV0IGFyZSBuZWl0aGVyIGtleXMgbm9yIHN5bWJvbHMuXG4gKiBUaGV5IGRvIG5vdCBoYXZlIGEgdXNlZnVsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBwcm9taXNlXG4gKiBQcm9taXNlcyBhcmUgcGFzc2FibGUsIGJ1dCBhcmUgbmVpdGhlciBrZXlzIG5vciBzeW1ib2xzLlxuICogVGhleSBkbyBub3QgaGF2ZSBhIHVzZWZ1bCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gdW5kZWZpbmVkXG4gKiBBbGwga2V5cyBpbmNsdWRpbmcgYHVuZGVmaW5lZGAgYXJlIGFscmVhZHkgdmFsaWQgcGF0dGVybnMgYW5kXG4gKiBzbyBjYW4gdmFsaWRseSByZXByZXNlbnQgdGhlbXNlbHZlcy4gQnV0IG9wdGlvbmFsIHBhdHRlcm4gYXJndW1lbnRzXG4gKiBgKHBhdHRlcm4gPSB1bmRlZmluZWQpID0+IC4uLmBcbiAqIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGB1bmRlZmluZWRgIHBhc3NlZCBhcyBhIHBhdHRlcm4gdnNcbiAqIG9taXNzaW9uIG9mIHRoZSBhcmd1bWVudC4gSXQgd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0IGFzIHRoZVxuICogc2Vjb25kLiBUaHVzLCB3aGVuIGEgcGFzc2VkIHBhdHRlcm4gZG9lcyBub3QgYWxzbyBuZWVkIHRvIGJlIGEga2V5LFxuICogd2UgcmVjb21tZW5kIHBhc3NpbmcgYE0udW5kZWZpbmVkKClgIGluc3RlYWQgb2YgYHVuZGVmaW5lZGAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBudWxsfSBudWxsXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGx0XG4gKiBNYXRjaGVzIGlmIDwgdGhlIHJpZ2h0IG9wZXJhbmQgYnkgY29tcGFyZUtleXNcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBsdGVcbiAqIE1hdGNoZXMgaWYgPD0gdGhlIHJpZ2h0IG9wZXJhbmQgYnkgY29tcGFyZUtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleSA6S2V5KSA9PiBNYXRjaGVyfSBlcVxuICogQHByb3BlcnR5IHsoa2V5IDpLZXkpID0+IE1hdGNoZXJ9IG5lcVxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGd0ZVxuICogTWF0Y2hlcyBpZiA+PSB0aGUgcmlnaHQgb3BlcmFuZCBieSBjb21wYXJlS2V5c1xuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGd0XG4gKiBNYXRjaGVzIGlmID4gdGhlIHJpZ2h0IG9wZXJhbmQgYnkgY29tcGFyZUtleXNcbiAqXG4gKiBAcHJvcGVydHkgeyhzdWJQYXR0PzogUGF0dGVybiwgbGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBhcnJheU9mXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIHZhbHVlUGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gcmVjb3JkT2ZcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCBsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHNldE9mXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGNvdW50UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gYmFnT2ZcbiAqIFBhcmFtZXRlcml6ZWQgYnkgYSBrZXlQYXR0IHRoYXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IGV2ZXJ5IGVsZW1lbnQgb2YgdGhlXG4gKiBhYnN0cmFjdCBiYWcuIEluIHRlcm1zIG9mIHRoZSBiYWcgcmVwcmVzZW50YXRpb24sIGl0IGlzIG1hdGNoZWQgYWdhaW5zdFxuICogdGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCBwYWlyLiBJZiB0aGUgc2Vjb25kIGBjb3VudFBhdHRgIGlzIHByb3ZpZGVkLFxuICogaXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBjYXJkaW5hbGl0eSBvZiBlYWNoIGVsZW1lbnQuIFRoZSBgY291bnRQYXR0YFxuICogaXMgcmFyZWx5IGV4cGVjdGVkIHRvIGJlIHVzZWZ1bCwgYnV0IGlzIHByb3ZpZGVkIHRvIG1pbmltaXplIHN1cnByaXNlLlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IG1hcE9mXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IFBhdHRlcm5bXSxcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogUGF0dGVybltdLFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0QXJyYXlcbiAqIFNwbGl0cyBhbiBhcnJheSAtLS0gdHlwaWNhbGx5IGFuIGFyZ3VtZW50cyBsaXN0IC0tLSBpbnRvIGFuIGluaXRpYWxcbiAqIHBvcnRpb24gdGhhdCBtYXRjaGVzIHRoZSBgcmVxdWlyZWRgIHBhdHRlcm4sIHRoZW4gdGhlIHBvcnRpb24gdGhhdCBtYXRjaGVzXG4gKiB0aGUgYG9wdGlvbmFsYCBwYXR0ZXJuLCBhbmQgdGhlIHJlbWFpbmRlciB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlXG4gKiBgcmVzdGAgcGF0dGVybi4gVGhlIHNwZWNpbWVuIG11c3QgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgYHJlcXVpcmVkYFxuICogcGF0dGVybiwgYnV0IHRoZSByZW1haW5kZXIgY2FuIGJlIHNob3J0ZXIgdGhhbiB0aGUgYG9wdGlvbmFsYCBwYXR0ZXJuLlxuICogV2l0aGluIHRoZSBvcHRpb25hbCBwb3J0aW9uLCBhbiBgdW5kZWZpbmVkYCBhcmcgbWF0Y2hlcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBBbnkgZWxlbWVudHMgYmV5b25kIHRoZSBgb3B0aW9uYWxgIHBhdHRlcm4gYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGVcbiAqIGByZXN0YCBwYXR0ZXJuLlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IENvcHlSZWNvcmQ8UGF0dGVybj4sXG4gKiAgICAgICAgICAgICBvcHRpb25hbD86IENvcHlSZWNvcmQ8UGF0dGVybj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRSZWNvcmRcbiAqIFNwbGl0cyBhIGNvcHlSZWNvcmQgaW50byB0aG9zZSBwcm9wZXJ0aWVzIHRoYXQgbWF0Y2ggdGhlIGByZXF1aXJlZGBcbiAqIHBhdHRlcm4sIHRoZSByZW1haW5kZXIgd2hpY2ggaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgb3B0aW9uYWxgIHBhdHRlcm4uXG4gKiBBbnkgcHJvcGVydGllcyBub3QgbWF0Y2hlZCBieSBlaXRoZXIgYXJlIGdhdGhlcmVkIGludG8gYSByZWNvcmQgdGhhdFxuICogaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgcmVzdGAgcGF0dGVybi5cbiAqIFRoZSBzcGVjaW1lbiBtdXN0IGhhdmUgYWxsIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXBwZWFyIG9uIHRoZSBgcmVxdWlyZWRgXG4gKiBwYXR0ZXJuLiBJdCBtYXkgb21pdCBwcm9wZXJ0aWVzIHRoYXQgYXBwZWFyIG9uIHRoZSBvcHRpb25hbCBwYXR0ZXJuLlxuICogRm9yIHRoZXNlIHB1cnBvc2VzLCBgdW5kZWZpbmVkYCBpcyBsaWtlIG9taXNzaW9uIC0tLSBzdWNoIHByb3BlcnRpZXNcbiAqIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJlcXVpcmVkOiBDb3B5UmVjb3JkPCo+IHwgQ29weUFycmF5PCo+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0XG4gKiBEZXByZWNhdGVkLiBVc2UgYE0uc3BsaXRBcnJheWAgb3IgYE0uc3BsaXRSZWNvcmRgIGluc3RlYWQuXG4gKlxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYmFzZSBwYXR0ZXJuLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggbWF0Y2hlcyBhZ2FpbnN0IHRoZSBvcHRpb25hbFxuICogcmVzdCBwYXR0ZXJuIGlmIHByZXNlbnQuXG4gKiBAcHJvcGVydHkgeyhiYXNlOiBDb3B5UmVjb3JkPCo+IHwgQ29weUFycmF5PCo+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHBhcnRpYWxcbiAqIERlcHJlY2F0ZWQuIFVzZSBgTS5zcGxpdEFycmF5YCBvciBgTS5zcGxpdFJlY29yZGAgaW5zdGVhZC5cbiAqXG4gKiBBbiBhcnJheSBvciByZWNvcmQgaXMgc3BsaXQgaW50byB0aGUgZmlyc3QgcGFydCB0aGF0IG1hdGNoZXMgdGhlXG4gKiBiYXNlIHBhdHRlcm4sIGFuZCB0aGUgcmVtYWluZGVyLCB3aGljaCBtYXRjaGVzIGFnYWluc3QgdGhlIG9wdGlvbmFsXG4gKiByZXN0IHBhdHRlcm4gaWYgcHJlc2VudC5cbiAqIFVubGlrZSBgTS5zcGxpdGAsIGBNLnBhcnRpYWxgIGlnbm9yZXMgcHJvcGVydGllcyBvbiB0aGUgYmFzZVxuICogcGF0dGVybiB0aGF0IGFyZSBub3QgcHJlc2VudCBvbiB0aGUgc3BlY2ltZW4uXG4gKlxuICogQHByb3BlcnR5IHsodDogUGF0dGVybikgPT4gUGF0dGVybn0gZXJlZlxuICogQHByb3BlcnR5IHsodDogUGF0dGVybikgPT4gUGF0dGVybn0gb3B0XG4gKlxuICogQHByb3BlcnR5IHs8TSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqICAgICAgICAgICAgIG1ldGhvZEd1YXJkczogTSxcbiAqICAgICAgICAgICAgIG9wdGlvbnM/OiB7c2xvcHB5PzogYm9vbGVhbn1cbiAqICkgPT4gSW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZVxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGxXaGVuXG4gKlxuICogQHByb3BlcnR5IHsoYXJnR3VhcmQ6IEFyZ0d1YXJkKSA9PiBBcmdHdWFyZH0gYXdhaXRcbiAqL1xuXG4vKiogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBNZXRob2QgKi9cblxuLyogVE9ETyBwYXJhbWV0ZXJpemUgdGhpcyB0byBtYXRjaCB0aGUgYmVoYXZpb3Igb2JqZWN0IGl0IGd1YXJkcyovXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiBrbGFzczogJ0ludGVyZmFjZScsXG4gKiBpbnRlcmZhY2VOYW1lOiBzdHJpbmcsXG4gKiBtZXRob2RHdWFyZHM6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIE1ldGhvZEd1YXJkPlxuICogc2xvcHB5PzogYm9vbGVhblxuICogfX0gSW50ZXJmYWNlR3VhcmRcbiAqL1xuXG4vKiogQHR5cGVkZWYge2FueX0gTWV0aG9kR3VhcmRNYWtlclxuICogYSBwYXJhbWV0ZXIgbGlzdCBsaWtlIGZvbyhhLCBiLCBjID0gZCwg4oCmZSkgPT4gZiBzaG91bGQgYmUgZ3VhcmRlZCBieVxuICogc29tZXRoaW5nIGxpa2VcbiAqIGZvbzogTS5jYWxsKEFTaGFwZSwgQlNoYXBlKS5vcHRpb25hbChDU2hhcGUpLnJlc3QoRVNoYXBlKS5yZXR1cm5zKEZTaGFwZSlcbiAqIG9wdGlvbmFsIGlzIGZvciBvcHRpb25hbCAoPSkgcGFyYW1zLiByZXN0IGlzIGZvciDigKYgKHZhcmFyZ3MpIHBhcmFtc1xuICovXG5cbi8qKiBAdHlwZWRlZiB7eyBrbGFzczogJ21ldGhvZEd1YXJkJywgY2FsbEtpbmQ6ICdzeW5jJyB8ICdhc3luYycsIHJldHVybkd1YXJkOiB1bmtub3duIH19IE1ldGhvZEd1YXJkICovXG4vKiogQHR5cGVkZWYge2FueX0gQXJnR3VhcmQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXR0ZXJuS2l0XG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBwYXR0OiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogICAgICAgICAgICAgbGFiZWw/OiBzdHJpbmd8bnVtYmVyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlc1xuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCBwYXR0OiBQYXR0ZXJuKSA9PiBib29sZWFufSBtYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4sIGxhYmVsPzogc3RyaW5nfG51bWJlcikgPT4gdm9pZH0gZml0XG4gKiBAcHJvcGVydHkgeyhwYXR0OiBQYXR0ZXJuKSA9PiB2b2lkfSBhc3NlcnRQYXR0ZXJuXG4gKiBAcHJvcGVydHkgeyhwYXR0OiBQYXNzYWJsZSkgPT4gYm9vbGVhbn0gaXNQYXR0ZXJuXG4gKiBAcHJvcGVydHkgeyhwYXR0OiBQYXR0ZXJuKSA9PiB2b2lkfSBhc3NlcnRLZXlQYXR0ZXJuXG4gKiBAcHJvcGVydHkgeyhwYXR0OiBQYXNzYWJsZSkgPT4gYm9vbGVhbn0gaXNLZXlQYXR0ZXJuXG4gKiBAcHJvcGVydHkge0dldFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBAcHJvcGVydHkge01hdGNoZXJOYW1lc3BhY2V9IE1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIFRPRE8qL1xuLyogVGhlIGZvbGxvd2luZyB0eXBlIHNob3VsZCBiZSBpbiBpbnRlcm5hbC10eXBlcy5qcywgc2luY2UgdGhlKi9cbi8qIGBNYXRjaEhlbHBlcmAgdHlwZSBpcyBwdXJlbHkgaW50ZXJuYWwgdG8gdGhpcyBwYWNrYWdlLiBIb3dldmVyLCovXG4vKiBpbiBvcmRlciB0byBnZXQgdGhlIGdvdmVybmFuY2UgYW5kIHNvbG8gcGFja2FnZXMgYm90aCB0byBwYXNzIGxpbnQsKi9cbi8qIEkgbW92ZWQgdGhlIHR5cGUgZGVjbGFyYXRpb24gaXRzZWxmIHRvIHR5cGVzLmpzLiBTZWUgdGhlIGNvbW1lbnRzIGluKi9cbi8qIGluIGludGVybmFsLXR5cGVzLmpzIGFuZCBleHBvcnRzLmpzKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlclxuICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXNcbiAqIGVuY2Fwc3VsYXRlZCwgYW5kIGl0cyBtZXRob2RzIGNhbiBtYWtlIHRoZSBzdGF0ZWQgdW5jaGVja2VyIGFzc3VtcHRpb25zXG4gKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWRcbiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZ1xuICogbWF0Y2hUYWcuIElzIHRoaXMgYSB2YWxpZCBwYXlsb2FkIGZvciBhIE1hdGNoZXIgd2l0aCB0aGF0IHRhZz9cbiAqXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBtYXRjaGVyUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlcixcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBBc3N1bWluZyBhIHZhbGlkIE1hdGNoZXIgb2YgdGhpcyB0eXBlIHdpdGggYG1hdGNoZXJQYXlsb2FkYCBhcyBpdHNcbiAqIHBheWxvYWQsIGRvZXMgdGhpcyBzcGVjaW1lbiBtYXRjaCB0aGF0IE1hdGNoZXI/XG4gKlxuICogQHByb3BlcnR5IHsoXG4gKiAgIHBheWxvYWQ6IFBhc3NhYmxlLFxuICogICBlbmNvZGVQYXNzYWJsZTogS2V5VG9EQktleVxuICogKSA9PiBSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlclxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gUmV0dXJuIGEgUmFua0NvdmVyIHRvIGJvdW5kIGZyb20gYmVsb3cgYW5kIGFib3ZlLFxuICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci5cbiAqIFRoZSBsZWZ0IGVsZW1lbnQgbXVzdCBiZSBiZWZvcmUgb3IgdGhlIHNhbWUgcmFuayBhcyBhbnkgcG9zc2libGVcbiAqIG1hdGNoaW5nIHNwZWNpbWVuLiBUaGUgcmlnaHQgZWxlbWVudCBtdXN0IGJlIGFmdGVyIG9yIHRoZSBzYW1lXG4gKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF0dGVybjogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0tleVBhdHRlcm5cbiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZ1xuICogbWF0Y2hUYWcuIElzIHRoaXMgYSB2YWxpZCBwYXR0ZXJuIGZvciB1c2UgYXMgYSBxdWVyeSBrZXkgb3Iga2V5IHNoYXBlP1xuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABbnmUauIgAAriIAAC4AAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZmFyLWNsYXNzLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4va2luZC11dGlscy5qcyIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIiwiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEZhckNsYXNzIiwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0Iiwidml2aWZ5RmFyQ2xhc3MiLCJ2aXZpZnlGYXJDbGFzc0tpdCIsInZpdmlmeUZhckluc3RhbmNlIiwidml2aWZ5U2luZ2xldG9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlS2luZEhhbmRsZSxkZWZpbmVLaW5kLGRlZmluZUtpbmRNdWx0aSxkZWZpbmVEdXJhYmxlS2luZCxkZWZpbmVEdXJhYmxlS2luZE11bHRpLHByb3ZpZGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi9raW5kLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlS2luZEhhbmRsZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUtpbmRIYW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wiZGVmaW5lS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChkZWZpbmVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRGVmaW5lS2luZE9wdGlvbnM8VD59IERlZmluZUtpbmRPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXQ8VD59IEtpbmRGYWNldCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0czxUPn0gS2luZEZhY2V0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSxTLFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZVZpcnR1YWxGYXJDbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lS2luZCh0YWcsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxGYXJDbGFzcyhkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MpO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEZhckNsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lS2luZE11bHRpKHRhZyxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlRmFyQ2xhc3M9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVEdXJhYmxlS2luZChraW5kSGFuZGxlLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRmFyQ2xhc3MoZGVmaW5lRHVyYWJsZUZhckNsYXNzKTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVGYXJDbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0PShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGtpbmRIYW5kbGUsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZDppbnRlcmZhY2VHdWFyZEtpdH0pOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KGRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUZhckNsYXNzPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRmFyQ2xhc3MoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUZhckNsYXNzKHZpdmlmeUZhckNsYXNzKTtcblxuaGFyZGVuKHZpdmlmeUZhckNsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RmFyQ2xhc3NLaXQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUZhckNsYXNzS2l0KHZpdmlmeUZhckNsYXNzS2l0KTtcblxuaGFyZGVuKHZpdmlmeUZhckNsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TX0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJJbnN0YW5jZT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgbWFrZVNpbmdsZXRvbj12aXZpZnlGYXJDbGFzcyhcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhbiBhcmJpdHJhcnkgdHlwZSovXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgdGhlXyR7a2luZE5hbWV9YCwoKT0+bWFrZVNpbmdsZXRvbigpKTtcbiB9OyRo4oCNX29uY2Uudml2aWZ5RmFySW5zdGFuY2Uodml2aWZ5RmFySW5zdGFuY2UpO1xuaGFyZGVuKHZpdmlmeUZhckluc3RhbmNlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2Ugdml2aWZ5RmFySW5zdGFuY2UgaW5zdGVhZC5cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlTaW5nbGV0b249KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG52aXZpZnlGYXJJbnN0YW5jZShiYWdnYWdlLGtpbmROYW1lLHVuZGVmaW5lZCxtZXRob2RzLG9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5U2luZ2xldG9uKHZpdmlmeVNpbmdsZXRvbik7XG5oYXJkZW4odml2aWZ5U2luZ2xldG9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzIl0sImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyJdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0Il0sInZpdmlmeUZhckNsYXNzIjpbInZpdmlmeUZhckNsYXNzIl0sInZpdmlmeUZhckNsYXNzS2l0IjpbInZpdmlmeUZhckNsYXNzS2l0Il0sInZpdmlmeUZhckluc3RhbmNlIjpbInZpdmlmeUZhckluc3RhbmNlIl0sInZpdmlmeVNpbmdsZXRvbiI6WyJ2aXZpZnlTaW5nbGV0b24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAj8s5Pz0GAAA9BgAAJAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Zhci1jbGFzcy11dGlscy5qcyIsIi4va2luZC11dGlscy5qcyIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJDbGFzcyIsInZpdmlmeUZhckNsYXNzS2l0Iiwidml2aWZ5RmFySW5zdGFuY2UiLCJ2aXZpZnlTaW5nbGV0b24iXSwicmVleHBvcnRzIjpbIi4va2luZC11dGlscy5qcyIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2tpbmQtdXRpbHMuanNcIiwgW11dLFtcIi4vZmFyLWNsYXNzLXV0aWxzLmpzXCIsIFtbXCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NcIl1dXSxbXCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXRcIl1dXSxbXCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NcIl1dXSxbXCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXRcIl1dXSxbXCJ2aXZpZnlGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcInZpdmlmeUZhckNsYXNzXCJdXV0sW1widml2aWZ5RmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlGYXJDbGFzc0tpdFwiXV1dLFtcInZpdmlmeUZhckluc3RhbmNlXCIsIFskaOKAjV9saXZlW1widml2aWZ5RmFySW5zdGFuY2VcIl1dXSxbXCJ2aXZpZnlTaW5nbGV0b25cIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlTaW5nbGV0b25cIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiZGVmaW5lVmlydHVhbEZhckNsYXNzIjpbImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsZmFsc2VdLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0IixmYWxzZV0sImRlZmluZUR1cmFibGVGYXJDbGFzcyI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IjpbImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsZmFsc2VdLCJ2aXZpZnlGYXJDbGFzcyI6WyJ2aXZpZnlGYXJDbGFzcyIsZmFsc2VdLCJ2aXZpZnlGYXJDbGFzc0tpdCI6WyJ2aXZpZnlGYXJDbGFzc0tpdCIsZmFsc2VdLCJ2aXZpZnlGYXJJbnN0YW5jZSI6WyJ2aXZpZnlGYXJJbnN0YW5jZSIsZmFsc2VdLCJ2aXZpZnlTaW5nbGV0b24iOlsidml2aWZ5U2luZ2xldG9uIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACPIKLQ0CQAANAkAACkAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMva2luZC11dGlscy5qc3siaW1wb3J0cyI6WyIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiaWdub3JlQ29udGV4dCIsInByb3ZpZGVLaW5kSGFuZGxlIiwidml2aWZ5S2luZCIsInZpdmlmeUtpbmRNdWx0aSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwcm92aWRlLGRlZmluZUR1cmFibGVLaW5kLGRlZmluZUR1cmFibGVLaW5kTXVsdGksbWFrZUtpbmRIYW5kbGU7JGjigI1faW1wb3J0cyhbW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZE11bHRpID0gJGjigI1fYSldXSxbXCJtYWtlS2luZEhhbmRsZVwiLCBbJGjigI1fYSA9PiAobWFrZUtpbmRIYW5kbGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dFxuICogaWdub3JlcyBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBGdW5jdGlvbj4oZm46IFQpID0+IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5QbHVzQ29udGV4dDxuZXZlciwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBpZ25vcmVDb250ZXh0PVxuKGZuKT0+XG4oX2NvbnRleHQsLi4uYXJncyk9PlxuZm4oLi4uYXJncyk7JGjigI1fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7RHVyYWJsZUtpbmRIYW5kbGV9XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlS2luZEhhbmRsZT0oYmFnZ2FnZSxraW5kTmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsKCk9Pm1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7JGjigI1fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7XG5oYXJkZW4ocHJvdmlkZUtpbmRIYW5kbGUpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJDbGFzcyBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlZpdmlmeUtpbmR9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlLaW5kPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUtpbmQodml2aWZ5S2luZCk7XG5cbmhhcmRlbih2aXZpZnlLaW5kKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2Ugdml2aWZ5RmFyQ2xhc3NLaXQgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5WaXZpZnlLaW5kTXVsdGl9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlLaW5kTXVsdGk9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlLaW5kTXVsdGkodml2aWZ5S2luZE11bHRpKTtcblxuaGFyZGVuKHZpdmlmeUtpbmRNdWx0aSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWdub3JlQ29udGV4dCI6WyJpZ25vcmVDb250ZXh0Il0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInZpdmlmeUtpbmQiOlsidml2aWZ5S2luZCJdLCJ2aXZpZnlLaW5kTXVsdGkiOlsidml2aWZ5S2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK3HZm3KHAAAyhwAADAAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiTSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJtYWtlS2luZEhhbmRsZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJwYXJ0aWFsQXNzaWduIiwicGlja0ZhY2V0IiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LE0sbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUscHJvdmlkZUxhenk7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wiTVwiXV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiXV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiXV1dLFtcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9hID0+IChwcm92aWRlTGF6eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5WYXREYXRhfSAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmFzc2VydChnbG9iYWxUaGlzLlZhdERhdGEsJ1ZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWQnKTtcblZhdERhdGFHbG9iYWw9Z2xvYmFsVGhpcy5WYXREYXRhO1xuIH1lbHNle1xuLyogWFhYIHRoaXMgbW9kdWxlIGhhcyBiZWVuIGtub3duIHRvIGdldCBpbXBvcnRlZCAodHJhbnNpdGl2ZWx5KSBpbiBjYXNlcyB0aGF0Ki9cbi8qIG5ldmVyIHVzZSBpdCBzbyB3ZSBtYWtlIGEgdmVyc2lvbiB0aGF0IHdpbGwgc2F0aXNmeSBtb2R1bGUgcmVzb2x1dGlvbiBidXQqL1xuLyogZmFpbCBhdCBydW50aW1lLiovXG5jb25zdCB1bnZhaWxhYmxlPSgpPT5hc3NlcnQuZmFpbCgnVmF0RGF0YSB1bmF2YWlsYWJsZScpO1xuVmF0RGF0YUdsb2JhbD17XG5kZWZpbmVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpOnVudmFpbGFibGUsXG5tYWtlS2luZEhhbmRsZTp1bnZhaWxhYmxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyOnVudmFpbGFibGUsXG53YXRjaFByb21pc2U6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOnVudmFpbGFibGUsXG5jYW5CZUR1cmFibGU6dW52YWlsYWJsZX07XG5cbiB9XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEZhckNsYXNzZXMvRmFySW5zdGFuY2VzIGluc3RlYWQgb2Yga2luZHNcbiAqL1xuY29uc3QgICAgICAge1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aX09XG5WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaOKAjV9vbmNlLmRlZmluZUtpbmRNdWx0aShkZWZpbmVLaW5kTXVsdGkpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuY29uc3QgICAgICAge1xubWFrZUtpbmRIYW5kbGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXIsXG53YXRjaFByb21pc2UsXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbmNhbkJlRHVyYWJsZX09XG5WYXREYXRhR2xvYmFsO1xuXG4vKipcbiAqIFdoZW4gbWFraW5nIGEgbXVsdGktZmFjZXQga2luZCwgaXQncyBjb21tb24gdG8gcGljayBvbmUgZmFjZXQgdG8gZXhwb3NlLiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5QaWNrRmFjZXR9XG4gKi8kaOKAjV9vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRo4oCNX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjigI1fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaOKAjV9vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbmNvbnN0ICAgICAgICBwYXJ0aWFsQXNzaWduPSh0YXJnZXQsc291cmNlKT0+e1xuT2JqZWN0LmFzc2lnbih0YXJnZXQsc291cmNlKTtcbiB9OyRo4oCNX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyoqXG4gKiBVbmxpa2UgYHByb3ZpZGVMYXp5YCwgYHByb3ZpZGVgIHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlXG4gKiB3aXRoaW4gYW55IHZhdCBpbmNhcm5hdGlvbiB3aXRoIGEgZ2l2ZW4gYGJhZ2dhZ2VgLGBrZXlgIHBhaXIuXG4gKlxuICogYHByb3ZpZGVgIHNob3VsZCBvbmx5IHRvIGJlIHVzZWQgdG8gcG9wdWxhdGUgYmFnZ2FnZSxcbiAqIHdoZXJlIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FsbHMgdG8gYHByb3ZpZGVgIG11c3QgYmVcbiAqIGxvdyBjYXJkaW5hbGl0eSwgc2luY2Ugd2Uga2VlcCB0aGUgYm9va2tlZXBpbmcgdG8gZGV0ZWN0IGNvbGxpc2lvbnNcbiAqIGluIG5vcm1hbCBsYW5ndWFnZS1oZWFwIG1lbW9yeS4gQWxsIHRoZSBvdGhlciBiYWdnYWdlLW9yaWVudGVkXG4gKiBgcHJvdmlkZSpgIGFuZCBgdml2aWZ5KmAgZnVuY3Rpb25zIGNhbGwgYHByb3ZpZGVgLFxuICogYW5kIHNvIGltcG9zZSB0aGUgc2FtZSBjb25zdHJhaW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGhcbiAqIG91ciBleHBlY3RlZCBkdXJhYmlsaXR5IHBhdHRlcm5zOiBXaGF0IHdlIHN0b3JlIGluIGJhZ2dhZ2UgYXJlXG4gKiAgICAqIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAgICAqIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHlcbiAqICAgICAgb2Ygc2luZ2xldG9uc1xuICogICAgKiBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcyxcbiAqIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6XG4gKiBJbXBsZW1lbnQgZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW5cbiAqIGBwcm92aWRlYCB2aW9sYXRlcyB0aGUgYWJvdmUgcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmVcbiAqIHRoYW4gb25lIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoIHRoZSBzYW1lXG4gKiBiYWdnYWdlLGtleSBwYWlyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlPXByb3ZpZGVMYXp5OyRo4oCNX29uY2UucHJvdmlkZShwcm92aWRlKTtcblxuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9Pm1ha2VTY2FsYXJCaWdNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWV9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuaGFyZGVuKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuXG5jb25zdCAgICAgICAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWV9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZVNldFN0b3JlPShiYWdnYWdlLG5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlfSkpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVTZXRTdG9yZShwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcbmhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJNIjpbIk0iLGZhbHNlXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7aBS7qcQAACnEAAANAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiaXNPZmZlclNhZmUiLCJzYXRpc2ZpZXNXYW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzT2ZmZXJTYWZlLCAnbmFtZScsIHt2YWx1ZTogXCJpc09mZmVyU2FmZVwifSk7JGjigI1fb25jZS5pc09mZmVyU2FmZShpc09mZmVyU2FmZSk7ICAgXG5cbi8qKlxuICogSGVscGVyIHRvIHBlcmZvcm0gc2F0aXNmaWVzV2FudCBhbmQgc2F0aXNmaWVzR2l2ZS4gSXNcbiAqIGFsbG9jYXRpb25BbW91bnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHJlcXVpcmVkQW1vdW50IGZvciBldmVyeVxuICoga2V5d29yZCBvZiBnaXZlT3JXYW50P1xuICpcbiAqIFRvIHByZXBhcmUgZm9yIG11bHRpcGxlcywgc2F0aXNmaWVzV2FudCBhbmQgc2F0aXNmaWVzR2l2ZSByZXR1cm4gMCBvciAxLlxuICogaXNPZmZlclNhZmUgd2lsbCBzdGlsbCBiZSBib29sZWFuLiBXaGVuIHdlIGhhdmUgTXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZFxuICogc2F0aXNmaWVzR2l2ZSB3aWxsIHRlbGwgaG93IG1hbnkgdGltZXMgdGhlIG9mZmVyIHdhcyBtYXRjaGVkLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gZ2l2ZU9yV2FudFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7MHwxfVxuICovXG5jb25zdCBzYXRpc2ZpZXNJbnRlcm5hbD0oZ2l2ZU9yV2FudD17fSxhbGxvY2F0aW9uKT0+e1xuY29uc3QgaXNHVEVCeUtleXdvcmQ9KFtrZXl3b3JkLHJlcXVpcmVkQW1vdW50XSk9Pntcbi8qIElmIHRoZXJlIGlzIG5vIGFsbG9jYXRpb24gZm9yIGEga2V5d29yZCwgd2Uga25vdyB0aGUgZ2l2ZU9yV2FudCovXG4vKiBpcyBub3Qgc2F0aXNmaWVkIHdpdGhvdXQgY2hlY2tpbmcgZnVydGhlci4qL1xuaWYoYWxsb2NhdGlvbltrZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBhbGxvY2F0aW9uQW1vdW50PWFsbG9jYXRpb25ba2V5d29yZF07XG5yZXR1cm4gQW1vdW50TWF0aC5pc0dURShhbGxvY2F0aW9uQW1vdW50LHJlcXVpcmVkQW1vdW50KT8xOjA7XG4gfTtcbnJldHVybiBPYmplY3QuZW50cmllcyhnaXZlT3JXYW50KS5ldmVyeShpc0dURUJ5S2V5d29yZCk/MTowO1xuIH07XG5cbi8qKlxuICogRm9yIHRoaXMgYWxsb2NhdGlvbiB0byBzYXRpc2Z5IHdoYXQgdGhlIHVzZXIgd2FudGVkLCB0aGVpclxuICogYWxsb2NhdGVkIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcHJvcG9zYWwud2FudC5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuY29uc3Qgc2F0aXNmaWVzV2FudD0ocHJvcG9zYWwsYWxsb2NhdGlvbik9Plxuc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwud2FudCxhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIGNvdW50IGFzIGEgZnVsbCByZWZ1bmQsIHRoZSBhbGxvY2F0ZWRcbiAqIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gd2hhdCB3YXMgb3JpZ2luYWxseVxuICogb2ZmZXJlZCAocHJvcG9zYWwuZ2l2ZSkuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqLyRo4oCNX29uY2Uuc2F0aXNmaWVzV2FudChzYXRpc2ZpZXNXYW50KTtcbmNvbnN0IHNhdGlzZmllc0dpdmU9KHByb3Bvc2FsLGFsbG9jYXRpb24pPT5cbnNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLmdpdmUsYWxsb2NhdGlvbik7XG5cbi8qKlxuICogYGlzT2ZmZXJTYWZlYCBjaGVja3Mgb2ZmZXIgc2FmZXR5IGZvciBhIHNpbmdsZSBvZmZlci5cbiAqXG4gKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC5naXZlYCAoZ2l2aW5nIGEgcmVmdW5kKSBvciB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC53YW50YC4gQm90aCBjYW4gYmUgZnVsbHkgc2F0aXNmaWVkLlxuICpcbiAqIEBwYXJhbSAge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtICB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIGlzT2ZmZXJTYWZlKHByb3Bvc2FsLGFsbG9jYXRpb24pe1xucmV0dXJuKFxuc2F0aXNmaWVzR2l2ZShwcm9wb3NhbCxhbGxvY2F0aW9uKT4wfHxcbnNhdGlzZmllc1dhbnQocHJvcG9zYWwsYWxsb2NhdGlvbik+MCk7XG5cbiB9XG5cbmhhcmRlbihpc09mZmVyU2FmZSk7XG5oYXJkZW4oc2F0aXNmaWVzV2FudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2F0aXNmaWVzV2FudCI6WyJzYXRpc2ZpZXNXYW50Il0sImlzT2ZmZXJTYWZlIjpbImlzT2ZmZXJTYWZlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANKe7oDgGwAA4BsAADgAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc3siaW1wb3J0cyI6WyIuL3NhZmVNYXRoLmpzIiwiQGFnb3JpYy9uYXQiXSwiZXhwb3J0cyI6WyJjYWxjTGlxVmFsdWVUb01pbnQiLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLCJjYWxjVmFsdWVUb1JlbW92ZSIsImdldElucHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsbmF0U2FmZU1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vc2FmZU1hdGguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsIFskaOKAjV9hID0+IChuYXRTYWZlTWF0aCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e3N1YnRyYWN0LGFkZCxtdWx0aXBseSxmbG9vckRpdmlkZX09bmF0U2FmZU1hdGg7XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgQkFTSVNfUE9JTlRTPTEwMDAwbjsvKiBUT0RPIGNoYW5nZSB0byAxMF8wMDBuIG9uY2UgdG9vbGluZyBjb3Blcy4qL1xuXG4vKipcbiAqIENhbGN1bGF0aW9ucyBmb3IgY29uc3RhbnQgcHJvZHVjdCBtYXJrZXRzIGxpa2UgVW5pc3dhcC5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ydW50aW1ldmVyaWZpY2F0aW9uL3ZlcmlmaWVkLXNtYXJ0LWNvbnRyYWN0cy9ibG9iL3VuaXN3YXAvdW5pc3dhcC94LXktay5wZGZcbiAqL1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIGdpdmVuXG4gKiBiYWNrIHRvIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgc2VudCBpbi4gUmV1c2VkIGluXG4gKiBzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMsIGluY2x1ZGluZyB0byBjaGVjayB3aGV0aGVyIGFuIG9mZmVyXG4gKiBpcyB2YWxpZCwgZ2V0dGluZyB0aGUgY3VycmVudCBwcmljZSBmb3IgYW4gYXNzZXQgb24gdXNlclxuICogcmVxdWVzdCwgYW5kIHRvIGRvIHRoZSBhY3R1YWwgcmVhbGxvY2F0aW9uIGFmdGVyIGFuIG9mZmVyIGhhc1xuICogYmVlbiBtYWRlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCBzZW50XG4gKiBpbiB0byBiZSBzd2FwcGVkXG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgc2VudCBpblxuICogQHBhcmFtIHthbnl9IG91dHB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCB0byBiZSBzZW50IG91dFxuICogQHBhcmFtIHtiaWdpbnR9IFtmZWVCYXNpc1BvaW50cz0zMG5dIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZVxuICogaXMgdGFrZW4gZnJvbSBpbnB1dFZhbHVlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IG91dHB1dFZhbHVlIC0gdGhlIGN1cnJlbnQgcHJpY2UsIGluIHZhbHVlIGZvcm1cbiAqL1xuY29uc3QgICAgICAgIGdldElucHV0UHJpY2U9KFxuaW5wdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSxcbm91dHB1dFJlc2VydmUsXG5mZWVCYXNpc1BvaW50cz0zMG4pPT5cbntcbmlucHV0VmFsdWU9TmF0KGlucHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xub3V0cHV0UmVzZXJ2ZT1OYXQob3V0cHV0UmVzZXJ2ZSk7XG5hc3NlcnQoaW5wdXRWYWx1ZT4wbixYIGBpbnB1dFZhbHVlICR7aW5wdXRWYWx1ZX0gbXVzdCBiZSBwb3NpdGl2ZWApO1xuYXNzZXJ0KGlucHV0UmVzZXJ2ZT4wbixYIGBpbnB1dFJlc2VydmUgJHtpbnB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgKTtcbm91dHB1dFJlc2VydmU+MG58fFxuYXNzZXJ0LmZhaWwoWCBgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgKTtcblxuY29uc3Qgb25lTWludXNGZWVTY2FsZWQ9c3VidHJhY3QoQkFTSVNfUE9JTlRTLGZlZUJhc2lzUG9pbnRzKTtcbmNvbnN0IGlucHV0V2l0aEZlZT1tdWx0aXBseShpbnB1dFZhbHVlLG9uZU1pbnVzRmVlU2NhbGVkKTtcbmNvbnN0IG51bWVyYXRvcj1tdWx0aXBseShpbnB1dFdpdGhGZWUsb3V0cHV0UmVzZXJ2ZSk7XG5jb25zdCBkZW5vbWluYXRvcj1hZGQobXVsdGlwbHkoaW5wdXRSZXNlcnZlLEJBU0lTX1BPSU5UUyksaW5wdXRXaXRoRmVlKTtcbnJldHVybiBmbG9vckRpdmlkZShudW1lcmF0b3IsZGVub21pbmF0b3IpO1xuIH07XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBjYWxjdWxhdGluZyBob3cgbXVjaCBzaG91bGQgYmUgdGFrZW5cbiAqIGZyb20gdGhlIHVzZXIgaW4gZXhjaGFuZ2UgZm9yIHdoYXQgdGhleSB3YW50IHRvIG9idGFpbi4gUmV1c2VkIGluXG4gKiBzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMsIGluY2x1ZGluZyB0byBjaGVjayB3aGV0aGVyIGFuIG9mZmVyXG4gKiBpcyB2YWxpZCwgZ2V0dGluZyB0aGUgY3VycmVudCBwcmljZSBmb3IgYW4gYXNzZXQgb24gdXNlclxuICogcmVxdWVzdCwgYW5kIHRvIGRvIHRoZSBhY3R1YWwgcmVhbGxvY2F0aW9uIGFmdGVyIGFuIG9mZmVyIGhhc1xuICogYmVlbiBtYWRlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBvdXRwdXRWYWx1ZSAtIHRoZSB2YWx1ZSBvZiB0aGUgYXNzZXQgdGhlIHVzZXIgd2FudHNcbiAqIHRvIGdldFxuICogQHBhcmFtIHthbnl9IGlucHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBhc3NldCBiZWluZyBzcGVudFxuICogQHBhcmFtIHthbnl9IG91dHB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCB0byBiZSBzZW50IG91dFxuICogQHBhcmFtIHtiaWdpbnR9IFtmZWVCYXNpc1BvaW50cz0zMG5dIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZSBpcyB0YWtlbiBmcm9tXG4gKiBvdXRwdXRWYWx1ZVxuICogQHJldHVybnMge05hdFZhbHVlfSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIGlucHV0IHJlcXVpcmVkIHRvIHB1cmNoYXNlIG91dHB1dFxuICovJGjigI1fb25jZS5nZXRJbnB1dFByaWNlKGdldElucHV0UHJpY2UpO1xuY29uc3QgICAgICAgIGdldE91dHB1dFByaWNlPShcbm91dHB1dFZhbHVlLFxuaW5wdXRSZXNlcnZlLFxub3V0cHV0UmVzZXJ2ZSxcbmZlZUJhc2lzUG9pbnRzPTMwbik9Plxue1xub3V0cHV0VmFsdWU9TmF0KG91dHB1dFZhbHVlKTtcbmlucHV0UmVzZXJ2ZT1OYXQoaW5wdXRSZXNlcnZlKTtcbm91dHB1dFJlc2VydmU9TmF0KG91dHB1dFJlc2VydmUpO1xuXG5hc3NlcnQoaW5wdXRSZXNlcnZlPjBuLFggYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWApO1xub3V0cHV0UmVzZXJ2ZT4wbnx8XG5hc3NlcnQuZmFpbChYIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWApO1xub3V0cHV0UmVzZXJ2ZT5vdXRwdXRWYWx1ZXx8XG5hc3NlcnQuZmFpbChcblggYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvdXRwdXRWYWx1ZSAke291dHB1dFZhbHVlfWApO1xuXG5cbmNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkPXN1YnRyYWN0KEJBU0lTX1BPSU5UUyxmZWVCYXNpc1BvaW50cyk7XG5jb25zdCBudW1lcmF0b3I9bXVsdGlwbHkobXVsdGlwbHkob3V0cHV0VmFsdWUsaW5wdXRSZXNlcnZlKSxCQVNJU19QT0lOVFMpO1xuY29uc3QgZGVub21pbmF0b3I9bXVsdGlwbHkoXG5zdWJ0cmFjdChvdXRwdXRSZXNlcnZlLG91dHB1dFZhbHVlKSxcbm9uZU1pbnVzRmVlU2NhbGVkKTtcblxucmV0dXJuIGFkZChmbG9vckRpdmlkZShudW1lcmF0b3IsZGVub21pbmF0b3IpLDFuKTtcbiB9O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbWFueSBsaXF1aWRpdHkgdG9rZW5zIHdlIHNob3VsZCBiZSBtaW50aW5nIHRvIHNlbmQgYmFjayB0byB0aGVcbiAqIHVzZXIgd2hlbiBhZGRpbmcgbGlxdWlkaXR5LiBXZSBwcm92aWRlIG5ldyBsaXF1aWRpdHkgZXF1YWwgdG8gdGhlIGV4aXN0aW5nXG4gKiBsaXF1aWRpdHkgbXVsdGlwbGllZCBieSB0aGUgcmF0aW8gb2YgbmV3IGNlbnRyYWwgdG9rZW5zIHRvIGNlbnRyYWwgdG9rZW5zXG4gKiBhbHJlYWR5IGhlbGQuIElmIHRoZSBjdXJyZW50IHN1cHBseSBpcyB6ZXJvLCByZXR1cm4gdGhlIGlucHV0VmFsdWUgYXMgdGhlXG4gKiBpbml0aWFsIGxpcXVpZGl0eSB0byBtaW50IGlzIGFyYml0cmFyeS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbGlxVG9rZW5TdXBwbHlcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFZhbHVlXG4gKiBAcGFyYW0ge2JpZ2ludH0gaW5wdXRSZXNlcnZlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLmdldE91dHB1dFByaWNlKGdldE91dHB1dFByaWNlKTtcbmNvbnN0ICAgICAgICBjYWxjTGlxVmFsdWVUb01pbnQ9KFxubGlxVG9rZW5TdXBwbHksXG5pbnB1dFZhbHVlLFxuaW5wdXRSZXNlcnZlKT0+XG57XG5saXFUb2tlblN1cHBseT1OYXQobGlxVG9rZW5TdXBwbHkpO1xuaW5wdXRWYWx1ZT1OYXQoaW5wdXRWYWx1ZSk7XG5pbnB1dFJlc2VydmU9TmF0KGlucHV0UmVzZXJ2ZSk7XG5cbmlmKGxpcVRva2VuU3VwcGx5PT09MG4pe1xucmV0dXJuIGlucHV0VmFsdWU7XG4gfVxucmV0dXJuIGZsb29yRGl2aWRlKG11bHRpcGx5KGlucHV0VmFsdWUsbGlxVG9rZW5TdXBwbHkpLGlucHV0UmVzZXJ2ZSk7XG4gfTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgaG93IG11Y2ggb2YgdGhlIHNlY29uZGFyeSB0b2tlbiBpcyByZXF1aXJlZCBmcm9tIHRoZSB1c2VyIHdoZW5cbiAqIGFkZGluZyBsaXF1aWRpdHkuIFdlIHJlcXVpcmUgdGhhdCB0aGUgZGVwb3NpdGVkIHJhdGlvIG9mIGNlbnRyYWwgdG8gc2Vjb25kYXJ5XG4gKiBtYXRjaCB0aGUgY3VycmVudCByYXRpbyBvZiBob2xkaW5ncyBpbiB0aGUgcG9vbC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbEluIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGJlaW5nIGRlcG9zaXRlZFxuICogQHBhcmFtIHthbnl9IGNlbnRyYWxQb29sIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5UG9vbCAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5SW4gLSBUaGUgdmFsdWUgb2Ygc2Vjb25kYXJ5IGFzc2V0cyBwcm92aWRlZC4gSWZcbiAqIHRoZSBwb29sIGlzIGVtcHR5LCB0aGUgZW50aXJlIGFtb3VudCB3aWxsIGJlIGFjY2VwdGVkXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IC0gdGhlIGFtb3VudCBvZiBzZWNvbmRhcnkgcmVxdWlyZWRcbiAqLyRo4oCNX29uY2UuY2FsY0xpcVZhbHVlVG9NaW50KGNhbGNMaXFWYWx1ZVRvTWludCk7XG5jb25zdCAgICAgICAgY2FsY1NlY29uZGFyeVJlcXVpcmVkPShcbmNlbnRyYWxJbixcbmNlbnRyYWxQb29sLFxuc2Vjb25kYXJ5UG9vbCxcbnNlY29uZGFyeUluKT0+XG57XG5jZW50cmFsSW49TmF0KGNlbnRyYWxJbik7XG5jZW50cmFsUG9vbD1OYXQoY2VudHJhbFBvb2wpO1xuc2Vjb25kYXJ5UG9vbD1OYXQoc2Vjb25kYXJ5UG9vbCk7XG5zZWNvbmRhcnlJbj1OYXQoc2Vjb25kYXJ5SW4pO1xuXG5pZihjZW50cmFsUG9vbD09PTBufHxzZWNvbmRhcnlQb29sPT09MG4pe1xucmV0dXJuIHNlY29uZGFyeUluO1xuIH1cblxuY29uc3Qgc2NhbGVkU2Vjb25kYXJ5PWZsb29yRGl2aWRlKFxubXVsdGlwbHkoY2VudHJhbEluLHNlY29uZGFyeVBvb2wpLFxuY2VudHJhbFBvb2wpO1xuXG5jb25zdCBleGFjdD1cbm11bHRpcGx5KGNlbnRyYWxJbixzZWNvbmRhcnlQb29sKT09PVxubXVsdGlwbHkoc2NhbGVkU2Vjb25kYXJ5LGNlbnRyYWxQb29sKTtcblxuLyogZG9lc24ndCBtYXRjaCB0aGUgeC15LWsucGRmIHBhcGVyLCBidXQgbW9yZSBjb3JyZWN0LiBXaGVuIHRoZSByYXRpb3MgYXJlKi9cbi8qIGV4YWN0bHkgZXF1YWwsIGxQcmltZSBpcyBleGFjdGx5IGwgKiAoMSArIGFscGhhKSBhbmQgYWRkaW5nIG9uZSBpcyB3cm9uZyovXG5yZXR1cm4gZXhhY3Q/c2NhbGVkU2Vjb25kYXJ5OjFuK3NjYWxlZFNlY29uZGFyeTtcbiB9O1xuXG4vKiBDYWxjdWxhdGUgaG93IG1hbnkgdW5kZXJseWluZyB0b2tlbnMgKGluIHRoZSBmb3JtIG9mIGEgdmFsdWUpIHNob3VsZCBiZSovXG4vKiByZXR1cm5lZCB3aGVuIHJlbW92aW5nIGxpcXVpZGl0eS4qLyRo4oCNX29uY2UuY2FsY1NlY29uZGFyeVJlcXVpcmVkKGNhbGNTZWNvbmRhcnlSZXF1aXJlZCk7XG5jb25zdCAgICAgICAgY2FsY1ZhbHVlVG9SZW1vdmU9KFxubGlxVG9rZW5TdXBwbHksXG5wb29sVmFsdWUsXG5saXF1aWRpdHlWYWx1ZUluKT0+XG57XG5saXFUb2tlblN1cHBseT1OYXQobGlxVG9rZW5TdXBwbHkpO1xubGlxdWlkaXR5VmFsdWVJbj1OYXQobGlxdWlkaXR5VmFsdWVJbik7XG5wb29sVmFsdWU9TmF0KHBvb2xWYWx1ZSk7XG5cbnJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShsaXF1aWRpdHlWYWx1ZUluLHBvb2xWYWx1ZSksbGlxVG9rZW5TdXBwbHkpO1xuIH07JGjigI1fb25jZS5jYWxjVmFsdWVUb1JlbW92ZShjYWxjVmFsdWVUb1JlbW92ZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0SW5wdXRQcmljZSI6WyJnZXRJbnB1dFByaWNlIl0sImdldE91dHB1dFByaWNlIjpbImdldE91dHB1dFByaWNlIl0sImNhbGNMaXFWYWx1ZVRvTWludCI6WyJjYWxjTGlxVmFsdWVUb01pbnQiXSwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIjpbImNhbGNTZWNvbmRhcnlSZXF1aXJlZCJdLCJjYWxjVmFsdWVUb1JlbW92ZSI6WyJjYWxjVmFsdWVUb1JlbW92ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0Q7d+6xEAAOsRAAAwAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYm9uZGluZ0N1cnZlcy5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3JhdGlvLmpzIiwiLi9zYWZlTWF0aC5qcyIsIi4vc3RhdGVNYWNoaW5lLmpzIiwiLi9zdGF0aXN0aWNzLmpzIiwiLi96b2VIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImFzc2VydElzc3VlcktleXdvcmRzIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNWYWx1ZVRvUmVtb3ZlIiwiY2VpbERpdmlkZUJ5IiwiY2VpbE11bHRpcGx5QnkiLCJjaGVja1pDRiIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVwb3NpdFRvU2VhdCIsImZpdFByb3Bvc2FsU2hhcGUiLCJmbG9vckRpdmlkZUJ5IiwiZmxvb3JNdWx0aXBseUJ5IiwiZ2V0QW1vdW50SW4iLCJnZXRBbW91bnRPdXQiLCJnZXRJbnB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiLCJnZXRQcmljZURlc2NyaXB0aW9uIiwiZ2V0VGltZXN0YW1wIiwiaW52ZXJ0UmF0aW8iLCJtYWtlUmF0aW8iLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsIm1ha2VTdGF0ZU1hY2hpbmUiLCJtdWx0aXBseVJhdGlvcyIsIm5hdFNhZmVNYXRoIiwib2ZmZXJUbyIsIm9uZU1pbnVzIiwic2F0aXNmaWVzIiwic2F2ZUFsbElzc3VlcnMiLCJzd2FwIiwic3dhcEV4YWN0Iiwid2l0aGRyYXdGcm9tU2VhdCJdLCJyZWV4cG9ydHMiOlsiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vc3RhdGlzdGljcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYm9uZGluZ0N1cnZlcy5qc1wiLCBbW1wiZ2V0SW5wdXRQcmljZVwiLCBbJGjigI1fbGl2ZVtcImdldElucHV0UHJpY2VcIl1dXSxbXCJnZXRPdXRwdXRQcmljZVwiLCBbJGjigI1fbGl2ZVtcImdldE91dHB1dFByaWNlXCJdXV0sW1wiY2FsY0xpcVZhbHVlVG9NaW50XCIsIFskaOKAjV9saXZlW1wiY2FsY0xpcVZhbHVlVG9NaW50XCJdXV0sW1wiY2FsY1ZhbHVlVG9SZW1vdmVcIiwgWyRo4oCNX2xpdmVbXCJjYWxjVmFsdWVUb1JlbW92ZVwiXV1dLFtcImNhbGNTZWNvbmRhcnlSZXF1aXJlZFwiLCBbJGjigI1fbGl2ZVtcImNhbGNTZWNvbmRhcnlSZXF1aXJlZFwiXV1dXV0sW1wiLi9wcmljZUF1dGhvcml0eS5qc1wiLCBbXV0sW1wiLi9wcmljZVF1b3RlLmpzXCIsIFtbXCJnZXRBbW91bnRJblwiLCBbJGjigI1fbGl2ZVtcImdldEFtb3VudEluXCJdXV0sW1wiZ2V0QW1vdW50T3V0XCIsIFskaOKAjV9saXZlW1wiZ2V0QW1vdW50T3V0XCJdXV0sW1wiZ2V0VGltZXN0YW1wXCIsIFskaOKAjV9saXZlW1wiZ2V0VGltZXN0YW1wXCJdXV0sW1wiZ2V0UHJpY2VEZXNjcmlwdGlvblwiLCBbJGjigI1fbGl2ZVtcImdldFByaWNlRGVzY3JpcHRpb25cIl1dXV1dLFtcIi4vc2FmZU1hdGguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsIFskaOKAjV9saXZlW1wibmF0U2FmZU1hdGhcIl1dXV1dLFtcIi4vc3RhdGVNYWNoaW5lLmpzXCIsIFtbXCJtYWtlU3RhdGVNYWNoaW5lXCIsIFskaOKAjV9saXZlW1wibWFrZVN0YXRlTWFjaGluZVwiXV1dXV0sW1wiLi9zdGF0aXN0aWNzLmpzXCIsIFtdXSxbXCIuL3pvZUhlbHBlcnMuanNcIiwgW1tcImRlZmF1bHRBY2NlcHRhbmNlTXNnXCIsIFskaOKAjV9saXZlW1wiZGVmYXVsdEFjY2VwdGFuY2VNc2dcIl1dXSxbXCJzd2FwXCIsIFskaOKAjV9saXZlW1wic3dhcFwiXV1dLFtcImZpdFByb3Bvc2FsU2hhcGVcIiwgWyRo4oCNX2xpdmVbXCJmaXRQcm9wb3NhbFNoYXBlXCJdXV0sW1wiYXNzZXJ0UHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFByb3Bvc2FsU2hhcGVcIl1dXSxbXCJhc3NlcnRJc3N1ZXJLZXl3b3Jkc1wiLCBbJGjigI1fbGl2ZVtcImFzc2VydElzc3VlcktleXdvcmRzXCJdXV0sW1wic2F0aXNmaWVzXCIsIFskaOKAjV9saXZlW1wic2F0aXNmaWVzXCJdXV0sW1wiYXNzZXJ0TmF0QXNzZXRLaW5kXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0TmF0QXNzZXRLaW5kXCJdXV0sW1wic3dhcEV4YWN0XCIsIFskaOKAjV9saXZlW1wic3dhcEV4YWN0XCJdXV0sW1wiZGVwb3NpdFRvU2VhdFwiLCBbJGjigI1fbGl2ZVtcImRlcG9zaXRUb1NlYXRcIl1dXSxbXCJ3aXRoZHJhd0Zyb21TZWF0XCIsIFskaOKAjV9saXZlW1wid2l0aGRyYXdGcm9tU2VhdFwiXV1dLFtcInNhdmVBbGxJc3N1ZXJzXCIsIFskaOKAjV9saXZlW1wic2F2ZUFsbElzc3VlcnNcIl1dXSxbXCJvZmZlclRvXCIsIFskaOKAjV9saXZlW1wib2ZmZXJUb1wiXV1dLFtcImNoZWNrWkNGXCIsIFskaOKAjV9saXZlW1wiY2hlY2taQ0ZcIl1dXV1dLFtcIi4vcmF0aW8uanNcIiwgW1tcIm1ha2VSYXRpb1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VSYXRpb1wiXV1dLFtcIm1ha2VSYXRpb0Zyb21BbW91bnRzXCIsIFskaOKAjV9saXZlW1wibWFrZVJhdGlvRnJvbUFtb3VudHNcIl1dXSxbXCJmbG9vck11bHRpcGx5QnlcIiwgWyRo4oCNX2xpdmVbXCJmbG9vck11bHRpcGx5QnlcIl1dXSxbXCJmbG9vckRpdmlkZUJ5XCIsIFskaOKAjV9saXZlW1wiZmxvb3JEaXZpZGVCeVwiXV1dLFtcImNlaWxNdWx0aXBseUJ5XCIsIFskaOKAjV9saXZlW1wiY2VpbE11bHRpcGx5QnlcIl1dXSxbXCJjZWlsRGl2aWRlQnlcIiwgWyRo4oCNX2xpdmVbXCJjZWlsRGl2aWRlQnlcIl1dXSxbXCJhc3NlcnRJc1JhdGlvXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0SXNSYXRpb1wiXV1dLFtcImludmVydFJhdGlvXCIsIFskaOKAjV9saXZlW1wiaW52ZXJ0UmF0aW9cIl1dXSxbXCJvbmVNaW51c1wiLCBbJGjigI1fbGl2ZVtcIm9uZU1pbnVzXCJdXV0sW1wiYWRkUmF0aW9zXCIsIFskaOKAjV9saXZlW1wiYWRkUmF0aW9zXCJdXV0sW1wibXVsdGlwbHlSYXRpb3NcIiwgWyRo4oCNX2xpdmVbXCJtdWx0aXBseVJhdGlvc1wiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJnZXRJbnB1dFByaWNlIjpbImdldElucHV0UHJpY2UiLGZhbHNlXSwiZ2V0T3V0cHV0UHJpY2UiOlsiZ2V0T3V0cHV0UHJpY2UiLGZhbHNlXSwiY2FsY0xpcVZhbHVlVG9NaW50IjpbImNhbGNMaXFWYWx1ZVRvTWludCIsZmFsc2VdLCJjYWxjVmFsdWVUb1JlbW92ZSI6WyJjYWxjVmFsdWVUb1JlbW92ZSIsZmFsc2VdLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiOlsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIixmYWxzZV0sImdldEFtb3VudEluIjpbImdldEFtb3VudEluIixmYWxzZV0sImdldEFtb3VudE91dCI6WyJnZXRBbW91bnRPdXQiLGZhbHNlXSwiZ2V0VGltZXN0YW1wIjpbImdldFRpbWVzdGFtcCIsZmFsc2VdLCJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iLGZhbHNlXSwibmF0U2FmZU1hdGgiOlsibmF0U2FmZU1hdGgiLGZhbHNlXSwibWFrZVN0YXRlTWFjaGluZSI6WyJtYWtlU3RhdGVNYWNoaW5lIixmYWxzZV0sImRlZmF1bHRBY2NlcHRhbmNlTXNnIjpbImRlZmF1bHRBY2NlcHRhbmNlTXNnIixmYWxzZV0sInN3YXAiOlsic3dhcCIsZmFsc2VdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiLGZhbHNlXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIixmYWxzZV0sImFzc2VydElzc3VlcktleXdvcmRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIixmYWxzZV0sInNhdGlzZmllcyI6WyJzYXRpc2ZpZXMiLGZhbHNlXSwiYXNzZXJ0TmF0QXNzZXRLaW5kIjpbImFzc2VydE5hdEFzc2V0S2luZCIsZmFsc2VdLCJzd2FwRXhhY3QiOlsic3dhcEV4YWN0IixmYWxzZV0sImRlcG9zaXRUb1NlYXQiOlsiZGVwb3NpdFRvU2VhdCIsZmFsc2VdLCJ3aXRoZHJhd0Zyb21TZWF0IjpbIndpdGhkcmF3RnJvbVNlYXQiLGZhbHNlXSwic2F2ZUFsbElzc3VlcnMiOlsic2F2ZUFsbElzc3VlcnMiLGZhbHNlXSwib2ZmZXJUbyI6WyJvZmZlclRvIixmYWxzZV0sImNoZWNrWkNGIjpbImNoZWNrWkNGIixmYWxzZV0sIm1ha2VSYXRpbyI6WyJtYWtlUmF0aW8iLGZhbHNlXSwibWFrZVJhdGlvRnJvbUFtb3VudHMiOlsibWFrZVJhdGlvRnJvbUFtb3VudHMiLGZhbHNlXSwiZmxvb3JNdWx0aXBseUJ5IjpbImZsb29yTXVsdGlwbHlCeSIsZmFsc2VdLCJmbG9vckRpdmlkZUJ5IjpbImZsb29yRGl2aWRlQnkiLGZhbHNlXSwiY2VpbE11bHRpcGx5QnkiOlsiY2VpbE11bHRpcGx5QnkiLGZhbHNlXSwiY2VpbERpdmlkZUJ5IjpbImNlaWxEaXZpZGVCeSIsZmFsc2VdLCJhc3NlcnRJc1JhdGlvIjpbImFzc2VydElzUmF0aW8iLGZhbHNlXSwiaW52ZXJ0UmF0aW8iOlsiaW52ZXJ0UmF0aW8iLGZhbHNlXSwib25lTWludXMiOlsib25lTWludXMiLGZhbHNlXSwiYWRkUmF0aW9zIjpbImFkZFJhdGlvcyIsZmFsc2VdLCJtdWx0aXBseVJhdGlvcyI6WyJtdWx0aXBseVJhdGlvcyIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACDoXTVVSUAAFUlAAA5AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsYXNzZXJ0LFgsbWFrZVByb21pc2VLaXQsQW1vdW50TWF0aCxtYWtlTm90aWZpZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcImRldGFpbHNcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXIgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXRcIn0pOyRo4oCNX29uY2UubWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ29tcGFyZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudExpbWl0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0xUPShhbW91bnQsYW1vdW50TGltaXQpPT4hQW1vdW50TWF0aC5pc0dURShhbW91bnQsYW1vdW50TGltaXQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0xURT0oYW1vdW50LGFtb3VudExpbWl0KT0+QW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCxhbW91bnQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0dURT0oYW1vdW50LGFtb3VudExpbWl0KT0+QW1vdW50TWF0aC5pc0dURShhbW91bnQsYW1vdW50TGltaXQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0dUPShhbW91bnQsYW1vdW50TGltaXQpPT4hQW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCxhbW91bnQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBUcmlnZ2VyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IGNyZWF0ZUluc3RhbnRRdW90ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJc3N1ZXI8J3NldCc+fSBvcHRzLnF1b3RlSXNzdWVyXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8dW5rbm93bj4+fSBvcHRzLm5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gb3B0cy50aW1lclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBvcHRzLmNyZWF0ZVF1b3RlXG4gKiBAcGFyYW0ge0JyYW5kfSBvcHRzLmFjdHVhbEJyYW5kSW5cbiAqIEBwYXJhbSB7QnJhbmR9IG9wdHMuYWN0dWFsQnJhbmRPdXRcbiAqIEByZXR1cm5zIHtQcmljZUF1dGhvcml0eUtpdH1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdChvcHRzKXtcbmNvbnN0e1xudGltZXIsXG5jcmVhdGVRdW90ZSxcbmFjdHVhbEJyYW5kSW4sXG5hY3R1YWxCcmFuZE91dCxcbnF1b3RlSXNzdWVyLFxubm90aWZpZXJ9PVxub3B0cztcblxubGV0IGhhdmVGaXJzdFF1b3RlPWZhbHNlO1xuXG5FKG5vdGlmaWVyKS5cbmdldFVwZGF0ZVNpbmNlKCkuXG50aGVuKChfKT0+aGF2ZUZpcnN0UXVvdGU9dHJ1ZSk7XG5cbi8qKiBAdHlwZSB7U2V0PFRyaWdnZXI+fSAqL1xuY29uc3QgdHJpZ2dlcnM9bmV3IFNldCgpO1xuY29uc3QgbXV0YWJsZVRyaWdnZXJzPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IHRyaWdnZXJDcmVhdGVRdW90ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0IGZpcmVUcmlnZ2Vycz1hc3luYyh0cmlnZ2VyQ3JlYXRlUXVvdGUpPT57XG5pZighaGF2ZUZpcnN0UXVvdGUpe1xucmV0dXJuO1xuIH1cbmF3YWl0IFByb21pc2UuYWxsKFxuWy4uLnRyaWdnZXJzLC4uLkFycmF5LmZyb20obXV0YWJsZVRyaWdnZXJzLnZhbHVlcygpKV0ubWFwKCh0cmlnZ2VyKT0+XG50cmlnZ2VyKHRyaWdnZXJDcmVhdGVRdW90ZSkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBxdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG5jb25zdCBtYWtlUXVvdGVXaGVuT3V0PShjb21wYXJlQW1vdW50c0ZuKT0+XG4vKipcbiAqIFJldHVybiBhIHF1b3RlIHdoZW4gdHJpZ2dlcldoZW4gaXMgdHJ1ZSBvZiB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRJbiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIGNhbGNBbW91bnRUcmlnZ2VyXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50T3V0TGltaXQgdGhlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aCB0aGUgb3V0cHV0XG4gKiBvZiBjYWxjQW1vdW50VHJpZ2dlclxuICovXG5hc3luYyBmdW5jdGlvbiBxdW90ZVdoZW5PdXRUcmlnZ2VyKGFtb3VudEluLGFtb3VudE91dExpbWl0KXtcbmFtb3VudEluPUFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYW1vdW50T3V0TGltaXQ9QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsYW1vdW50T3V0TGltaXQpO1xuXG4vKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG5jb25zdCB0cmlnZ2VyUEs9bWFrZVByb21pc2VLaXQoKTtcblxuLyoqIEB0eXBlIHtQcmljZVF1b3RlVHJpZ2dlcn0gKi9cbmNvbnN0IHRyaWdnZXI9YXN5bmMoY3JlYXRlSW5zdGFudFF1b3RlKT0+e1xudHJ5e1xuY29uc3QgcXVvdGVQPWNyZWF0ZUluc3RhbnRRdW90ZSgoY2FsY0Ftb3VudE91dCk9PntcbmlmKCF0cmlnZ2Vycy5oYXModHJpZ2dlcikpe1xuLyogQWxyZWFkeSBmaXJlZC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBhbW91bnRPdXQ9Y2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbmlmKCFjb21wYXJlQW1vdW50c0ZuKGFtb3VudE91dCxhbW91bnRPdXRMaW1pdCkpe1xuLyogRG9uJ3QgZmlyZSB0aGUgdHJpZ2dlciB5ZXQuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG4vKiBHZW5lcmF0ZSB0aGUgcXVvdGUuKi9cbnJldHVybnthbW91bnRJbixhbW91bnRPdXR9O1xuIH0pO1xuXG5pZighcXVvdGVQKXtcbi8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xucmV0dXJuO1xuIH1cblxudHJpZ2dlcnMuZGVsZXRlKHRyaWdnZXIpO1xudHJpZ2dlclBLLnJlc29sdmUocXVvdGVQKTtcbiB9Y2F0Y2goZSl7XG4vKiBUcmlnZ2VyIGZhaWxlZCwgc28gcmVqZWN0IGFuZCBkcm9wLiovXG50cmlnZ2VyUEsucmVqZWN0KGUpO1xudHJpZ2dlcnMuZGVsZXRlKHRyaWdnZXIpO1xuIH1cbiB9O1xuXG50cmlnZ2Vycy5hZGQodHJpZ2dlcik7XG5cbi8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbmF3YWl0IHRyaWdnZXIoY3JlYXRlUXVvdGUpO1xuXG5yZXR1cm4gdHJpZ2dlclBLLnByb21pc2U7XG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBtdXRhYmxlUXVvdGVXaGVuKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcmVBbW91bnR9IGNvbXBhcmVBbW91bnRzRm5cbiAqL1xuY29uc3QgbWFrZU11dGFibGVRdW90ZT0oY29tcGFyZUFtb3VudHNGbik9PlxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50SW5cbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRPdXRMaW1pdFxuICovXG5hc3luYyBmdW5jdGlvbiBtdXRhYmxlUXVvdGVXaGVuT3V0VHJpZ2dlcihhbW91bnRJbixhbW91bnRPdXRMaW1pdCl7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLGFtb3VudEluKTtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LGFtb3VudE91dExpbWl0KTtcblxuLyoqIEB0eXBlIHtQcm9taXNlUmVjb3JkPFByaWNlUXVvdGU+fSAqL1xuY29uc3QgdHJpZ2dlclBLPW1ha2VQcm9taXNlS2l0KCk7XG5cbi8qKiBAdHlwZSB7TXV0YWJsZVF1b3RlfSAqL1xuY29uc3QgbXV0YWJsZVF1b3RlPUZhcignTXV0YWJsZVF1b3RlJyx7XG5jYW5jZWw6KGUpPT50cmlnZ2VyUEsucmVqZWN0KGUpLFxudXBkYXRlTGV2ZWw6KG5ld0Ftb3VudEluLG5ld0Ftb3VudE91dExpbWl0KT0+e1xuY29uc3QgY29lcmNlZEFtb3VudEluPUFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sbmV3QW1vdW50SW4pO1xuY29uc3QgY29lcmNlZEFtb3VudE91dExpbWl0PUFtb3VudE1hdGguY29lcmNlKFxuYWN0dWFsQnJhbmRPdXQsXG5uZXdBbW91bnRPdXRMaW1pdCk7XG5cbmFtb3VudEluPWNvZXJjZWRBbW91bnRJbjtcbmFtb3VudE91dExpbWl0PWNvZXJjZWRBbW91bnRPdXRMaW1pdDtcbmZpcmVUcmlnZ2VycyhjcmVhdGVRdW90ZSk7XG4gfSxcbmdldFByb21pc2U6KCk9PnRyaWdnZXJQSy5wcm9taXNlfSk7XG5cblxuLyoqIEB0eXBlIHtQcmljZVF1b3RlVHJpZ2dlcn0gKi9cbmNvbnN0IG11dGFibGVUcmlnZ2VyPWFzeW5jKGNyZWF0ZUluc3RhbnRRdW90ZSk9PntcbnRyeXtcbmNvbnN0IHF1b3RlUD1jcmVhdGVJbnN0YW50UXVvdGUoKGNhbGNBbW91bnRPdXQpPT57XG5pZighbXV0YWJsZVRyaWdnZXJzLmhhcyhtdXRhYmxlUXVvdGUpKXtcbi8qIEFscmVhZHkgZmlyZWQuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgYW1vdW50T3V0PWNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuXG5pZighY29tcGFyZUFtb3VudHNGbihhbW91bnRPdXQsYW1vdW50T3V0TGltaXQpKXtcbi8qIERvbid0IGZpcmUgdGhlIG11dGFibGVUcmlnZ2VyIHlldC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5cbmlmKCFxdW90ZVApe1xuLyogV2Ugc2hvdWxkbid0IHJlc29sdmUgeWV0LiovXG5yZXR1cm47XG4gfVxuXG5tdXRhYmxlVHJpZ2dlcnMuZGVsZXRlKG11dGFibGVRdW90ZSk7XG50cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuIH1jYXRjaChlKXtcbi8qIFRyaWdnZXIgZmFpbGVkLCBzbyByZWplY3QgYW5kIGRyb3AuKi9cbnRyaWdnZXJQSy5yZWplY3QoZSk7XG5tdXRhYmxlVHJpZ2dlcnMuZGVsZXRlKG11dGFibGVRdW90ZSk7XG4gfVxuIH07XG5cbm11dGFibGVUcmlnZ2Vycy5zZXQobXV0YWJsZVF1b3RlLG11dGFibGVUcmlnZ2VyKTtcblxuLyogRmlyZSBub3csIGp1c3QgaW4gY2FzZS4qL1xuYXdhaXQgbXV0YWJsZVRyaWdnZXIoY3JlYXRlUXVvdGUpO1xuXG5yZXR1cm4gbXV0YWJsZVF1b3RlO1xuIH07XG5cbi8qKlxuICogRW5zdXJlIHRoYXQgdGhlIGJyYW5kSW4vYnJhbmRPdXQgcGFpciBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRJblxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRPdXRcbiAqL1xuY29uc3QgYXNzZXJ0QnJhbmRzPShicmFuZEluLGJyYW5kT3V0KT0+e1xuYXNzZXJ0LmVxdWFsKFxuYnJhbmRJbixcbmFjdHVhbEJyYW5kSW4sXG5YIGBEZXNpcmVkIGJyYW5kSW4gJHticmFuZElufSBtdXN0IG1hdGNoICR7YWN0dWFsQnJhbmRJbn1gKTtcblxuYXNzZXJ0LmVxdWFsKFxuYnJhbmRPdXQsXG5hY3R1YWxCcmFuZE91dCxcblggYERlc2lyZWQgYnJhbmRPdXQgJHticmFuZE91dH0gbXVzdCBtYXRjaCAke2FjdHVhbEJyYW5kT3V0fWApO1xuXG4gfTtcblxuLyoqIEB0eXBlIHtQcmljZUF1dGhvcml0eX0gKi9cbmNvbnN0IHByaWNlQXV0aG9yaXR5PUZhcignUHJpY2VBdXRob3JpdHknLHtcbmdldFF1b3RlSXNzdWVyKGJyYW5kSW4sYnJhbmRPdXQpe1xuYXNzZXJ0QnJhbmRzKGJyYW5kSW4sYnJhbmRPdXQpO1xucmV0dXJuIHF1b3RlSXNzdWVyO1xuIH0sXG5nZXRUaW1lclNlcnZpY2UoYnJhbmRJbixicmFuZE91dCl7XG5hc3NlcnRCcmFuZHMoYnJhbmRJbixicmFuZE91dCk7XG5yZXR1cm4gdGltZXI7XG4gfSxcbm1ha2VRdW90ZU5vdGlmaWVyKGFtb3VudEluLGJyYW5kT3V0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuLyogV3JhcCBvdXIgdW5kZXJseWluZyBub3RpZmllciB3aXRoIHNwZWNpZmljIHF1b3Rlcy4qL1xuY29uc3Qgc3BlY2lmaWNCYXNlTm90aWZpZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PXVuZGVmaW5lZCl7XG4vKiBXZSB1c2UgdGhlIHNhbWUgdXBkYXRlQ291bnQgYXMgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIuKi9cbmNvbnN0IHJlY29yZD1hd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG5cbi8qIFdlIGNyZWF0ZSBhIHF1b3RlIGlubGluZS4qL1xuY29uc3QgcXVvdGU9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbil9KSk7XG5cbmFzc2VydChxdW90ZSk7XG5cbmNvbnN0IHZhbHVlPWF3YWl0IHF1b3RlO1xucmV0dXJuIGhhcmRlbih7XG52YWx1ZSxcbnVwZGF0ZUNvdW50OnJlY29yZC51cGRhdGVDb3VudH0pO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8UHJpY2VRdW90ZT59ICovXG5jb25zdCBzcGVjaWZpY05vdGlmaWVyPUZhcignUXVvdGVOb3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKHNwZWNpZmljQmFzZU5vdGlmaWVyKSxcbi8qIFRPRE8gc3RvcCBleHBvc2luZyBiYXNlTm90aWZpZXIgbWV0aG9kcyBkaXJlY3RseS4qL1xuLi4uc3BlY2lmaWNCYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIHNwZWNpZmljTm90aWZpZXI7XG4gfSxcbiAgICAgIGFzeW5jIHF1b3RlR2l2ZW4oYW1vdW50SW4sYnJhbmRPdXQpe1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsYnJhbmRPdXQpO1xuXG5hd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuY29uc3QgcXVvdGU9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbil9KSk7XG5cbmFzc2VydChxdW90ZSk7XG5yZXR1cm4gcXVvdGU7XG4gfSxcbiAgICAgIGFzeW5jIHF1b3RlV2FudGVkKGJyYW5kSW4sYW1vdW50T3V0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LGFtb3VudE91dCk7XG5hc3NlcnRCcmFuZHMoYnJhbmRJbixhbW91bnRPdXQuYnJhbmQpO1xuXG5hd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuY29uc3QgcXVvdGU9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQsY2FsY0Ftb3VudEluKT0+e1xuLyogV2UgbmVlZCB0byBkZXRlcm1pbmUgYW4gYW1vdW50SW4gdGhhdCBndWFyYW50ZWVzIGF0IGxlYXN0IHRoZSBhbW91bnRPdXQuKi9cbmNvbnN0IGFtb3VudEluPWNhbGNBbW91bnRJbihhbW91bnRPdXQpO1xuY29uc3QgYWN0dWFsQW1vdW50T3V0PWNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuQW1vdW50TWF0aC5pc0dURShhY3R1YWxBbW91bnRPdXQsYW1vdW50T3V0KXx8XG5hc3NlcnQuZmFpbChcblggYENhbGN1bGF0aW9uIG9mICR7YWN0dWFsQW1vdW50T3V0fSBkaWRuJ3QgY292ZXIgZXhwZWN0ZWQgJHthbW91bnRPdXR9YCk7XG5cbnJldHVybnthbW91bnRJbixhbW91bnRPdXR9O1xuIH0pO1xuYXNzZXJ0KHF1b3RlKTtcbnJldHVybiBxdW90ZTtcbiB9LFxuICAgICAgYXN5bmMgcXVvdGVBdFRpbWUoZGVhZGxpbmUsYW1vdW50SW4sYnJhbmRPdXQpe1xuYXNzZXJ0LnR5cGVvZihkZWFkbGluZSwnYmlnaW50Jyk7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLGFtb3VudEluKTtcbmFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCxicmFuZE91dCk7XG5cbmF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG5jb25zdCBxdW90ZVBLPW1ha2VQcm9taXNlS2l0KCk7XG5hd2FpdCBFKHRpbWVyKS5zZXRXYWtldXAoXG5kZWFkbGluZSxcbkZhcignd2FrZU9iaicse1xuICAgICAgYXN5bmMgd2FrZSh0aW1lc3RhbXApe1xudHJ5e1xuY29uc3QgcXVvdGVQPWNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0KT0+KHtcbmFtb3VudEluLFxuYW1vdW50T3V0OmNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxudGltZXN0YW1wfSkpO1xuXG5cbi8qIFdlIGRvbid0IHdhaXQgZm9yIHRoZSBxdW90ZSB0byBiZSBhdXRoZW50aWNhdGVkOyByZXNvbHZlKi9cbi8qIGltbWVkaWF0ZWx5LiovXG5xdW90ZVBLLnJlc29sdmUocXVvdGVQKTtcbmF3YWl0IHF1b3RlUEsucHJvbWlzZTtcbiB9Y2F0Y2goZSl7XG5xdW90ZVBLLnJlamVjdChlKTtcbiB9XG4gfX0pKTtcblxuXG5cbi8qIFdhaXQgdW50aWwgdGhlIHdha2V1cCBwYXNzZXMuKi9cbnJldHVybiBxdW90ZVBLLnByb21pc2U7XG4gfSxcbnF1b3RlV2hlbkxUOm1ha2VRdW90ZVdoZW5PdXQoaXNMVCksXG5xdW90ZVdoZW5MVEU6bWFrZVF1b3RlV2hlbk91dChpc0xURSksXG5xdW90ZVdoZW5HVEU6bWFrZVF1b3RlV2hlbk91dChpc0dURSksXG5xdW90ZVdoZW5HVDptYWtlUXVvdGVXaGVuT3V0KGlzR1QpLFxubXV0YWJsZVF1b3RlV2hlbkxUOm1ha2VNdXRhYmxlUXVvdGUoaXNMVCksXG5tdXRhYmxlUXVvdGVXaGVuTFRFOm1ha2VNdXRhYmxlUXVvdGUoaXNMVEUpLFxubXV0YWJsZVF1b3RlV2hlbkdUOm1ha2VNdXRhYmxlUXVvdGUoaXNHVCksXG5tdXRhYmxlUXVvdGVXaGVuR1RFOm1ha2VNdXRhYmxlUXVvdGUoaXNHVEUpfSk7XG5cblxucmV0dXJue3ByaWNlQXV0aG9yaXR5LGFkbWluRmFjZXQ6e2ZpcmVUcmlnZ2Vyc319O1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiOlsibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAORdLQqsCAAArAgAADUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25hdCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJnZXRBbW91bnRJbiIsImdldEFtb3VudE91dCIsImdldFByaWNlRGVzY3JpcHRpb24iLCJnZXRUaW1lc3RhbXAiLCJ1bml0QW1vdW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsTmF0LEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiBQcmljZUF1dGhvcml0aWVzIHJldHVybiBxdW90ZXMgYXMgYSBwYWlyIG9mIGFuIGFtb3VudCBhbmQgYSBwYXltZW50LCBib3RoKi9cbi8qIHdpdGggdGhlIHNhbWUgdmFsdWUuIFRoZSB1bmRlcmx5aW5nIGFtb3VudCB3cmFwcyBhbW91bnRJbiwgYW1vdW50T3V0LCB0aW1lciovXG4vKiBhbmQgdGltZXN0YW1wLiBUaGUgcGF5bWVudCBpcyBpc3N1ZWQgYnkgdGhlIHF1b3RlSXNzdWVyIHRvIHN1cHBvcnQgdmVyYWNpdHkqL1xuLyogY2hlY2tpbmcuIFRoZXNlIGhlbHBlcnMgbWFrZSBpdCBlYXNpZXIgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cyBvZiB0aGUgUXVvdGUqL1xuXG4vKipcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGVcbiAqIEByZXR1cm5zIHtQcmljZURlc2NyaXB0aW9ufVxuICovXG5jb25zdCAgICAgICAgZ2V0UHJpY2VEZXNjcmlwdGlvbj0ocXVvdGUpPT57XG5hc3NlcnQoXG5xdW90ZS5xdW90ZUFtb3VudC52YWx1ZS5sZW5ndGg9PT0xLFxuJ3F1b3RlQW1vdW50IHNldCBtdXN0IGhhdmUgb25lIG1lbWJlcicpO1xuXG5yZXR1cm4gcXVvdGUucXVvdGVBbW91bnQudmFsdWVbMF07XG4gfTtcblxuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaOKAjV9vbmNlLmdldFByaWNlRGVzY3JpcHRpb24oZ2V0UHJpY2VEZXNjcmlwdGlvbik7XG5jb25zdCAgICAgICAgZ2V0QW1vdW50SW49KHF1b3RlKT0+Z2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50SW47XG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRo4oCNX29uY2UuZ2V0QW1vdW50SW4oZ2V0QW1vdW50SW4pO1xuY29uc3QgICAgICAgIGdldEFtb3VudE91dD0ocXVvdGUpPT5nZXRQcmljZURlc2NyaXB0aW9uKHF1b3RlKS5hbW91bnRPdXQ7XG4vKiogQHR5cGUgeyhxdW90ZTogUHJpY2VRdW90ZSkgPT4gVGltZXN0YW1wfSAqLyRo4oCNX29uY2UuZ2V0QW1vdW50T3V0KGdldEFtb3VudE91dCk7XG5jb25zdCAgICAgICAgZ2V0VGltZXN0YW1wPShxdW90ZSk9PmdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLnRpbWVzdGFtcDtcblxuLyoqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBicmFuZCAqLyRo4oCNX29uY2UuZ2V0VGltZXN0YW1wKGdldFRpbWVzdGFtcCk7XG5jb25zdCAgICAgICAgdW5pdEFtb3VudD1hc3luYyhicmFuZCk9Pntcbi8qIEJyYW5kIG1ldGhvZHMgYXJlIHJlbW90ZSovXG5jb25zdCBkaXNwbGF5SW5mbz1hd2FpdCBFKGJyYW5kKS5nZXREaXNwbGF5SW5mbygpO1xuY29uc3QgZGVjaW1hbFBsYWNlcz1kaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzPz8wO1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwxMG4qKk5hdChkZWNpbWFsUGxhY2VzKSk7XG4gfTskaOKAjV9vbmNlLnVuaXRBbW91bnQodW5pdEFtb3VudCk7XG5oYXJkZW4odW5pdEFtb3VudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UHJpY2VEZXNjcmlwdGlvbiI6WyJnZXRQcmljZURlc2NyaXB0aW9uIl0sImdldEFtb3VudEluIjpbImdldEFtb3VudEluIl0sImdldEFtb3VudE91dCI6WyJnZXRBbW91bnRPdXQiXSwiZ2V0VGltZXN0YW1wIjpbImdldFRpbWVzdGFtcCJdLCJ1bml0QW1vdW50IjpbInVuaXRBbW91bnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhW0YtRQ2AAAUNgAAMAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qc3siaW1wb3J0cyI6WyIuL3NhZmVNYXRoLmpzIiwiLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9uYXQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImFzc2VydFBhcnNhYmxlTnVtYmVyIiwiY2VpbERpdmlkZUJ5IiwiY2VpbE11bHRpcGx5QnkiLCJkaXZpZGVCeSIsImZsb29yRGl2aWRlQnkiLCJmbG9vck11bHRpcGx5QnkiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibXVsdGlwbHlCeSIsIm11bHRpcGx5UmF0aW9zIiwib25lTWludXMiLCJwYXJzZVJhdGlvIiwicXVhbnRpemUiLCJyYXRpb0dURSIsInJhdGlvc1NhbWUiLCJzdWJ0cmFjdFJhdGlvcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsWCxxLEFtb3VudE1hdGgsYXNzZXJ0UmVjb3JkLGlzTmF0LG5hdFNhZmVNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9uYXRcIiwgW1tcImlzTmF0XCIsIFskaOKAjV9hID0+IChpc05hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLCBbJGjigI1fYSA9PiAobmF0U2FmZU1hdGggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7bXVsdGlwbHksZmxvb3JEaXZpZGUsY2VpbERpdmlkZSxiYW5rZXJzRGl2aWRlLGFkZCxzdWJ0cmFjdH09XG5uYXRTYWZlTWF0aDtcblxuLyogbWFrZSBhIFJhdGlvLCB3aGljaCByZXByZXNlbnRzIGEgZnJhY3Rpb24uIEl0IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZC4qL1xuLyoqL1xuLyogVGhlIG5hdHVyYWwgc3ludGF4IGZvciB0aGUgbW9zdCBjb21tb24gb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHN1cHBvcnQqL1xuLyogYXJlIEFtb3VudCAqIFJhdGlvIGFuZCBBbW91bnQgLyBSYXRpby4gU2luY2UgdGhlIG9wZXJhdGlvbnMgd2FudCB0byBhZGhlcmUgdG8qL1xuLyogdGhlIHJhdGlvIHJhdGhlciB0aGFuIHRoZSBhbW91bnQsIHdlIHNldHRsZWQgb24gYSBjYWxsaW5nIGNvbnZlbnRpb24gb2YqL1xuLyogW2NlaWx8Zmxvb3JdTXVsdGlwbHlCeShBbW91bnQsIFJhdGlvKSBhbmQgW2NlaWx8Zmxvb3JdRGl2aWRlQnkoQW1vdW50LCBSYXRpbykqL1xuLyoqL1xuLyogVGhlIG1vc3QgY29tbW9uIGtpbmQgb2YgUmF0aW8gY2FuIGJlIGFwcGxpZWQgdG8gQW1vdW50cyBvZiBhIHBhcnRpY3VsYXIqL1xuLyogYnJhbmQsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIHRoZSBzYW1lIGJyYW5kLiBUaGlzIHJlcHJlc2VudHMgYSBtdWx0aXBsaWVyKi9cbi8qIHRoYXQgaXMgb25seSBhcHBsaWNhYmxlIHRvIHRoYXQgYnJhbmQuIFRoZSBsZXNzIGNvbW1vbiBraW5kIG9mIFJhdGlvIGNhbiBiZSovXG4vKiBhcHBsaWVkIHRvIG9uZSBwYXJ0aWN1bGFyIGJyYW5kIG9mIGFtb3VudHMsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIGFub3RoZXIqL1xuLyogcGFydGljdWxhciBicmFuZC4gVGhpcyByZXByZXNlbnRzIHNvbWUga2luZCBvZiBleGNoYW5nZSByYXRlLiBUaGUqL1xuLyogYnJhbmQtY2hlY2tpbmcgaGVscHMgdXMgZW5zdXJlIHRoYXQgbm9ybWFsIFJhdGlvcyBhcmVuJ3QgYXBwbGllZCB0byBhbW91bnRzKi9cbi8qIG9mIHRoZSB3cm9uZyBicmFuZCwgYW5kIHRoYXQgZXhjaGFuZ2UgcmF0ZXMgYXJlIG9ubHkgdXNlZCBpbiB0aGUgYXBwcm9wcmlhdGUqL1xuLyogZGlyZWN0aW9uLiovXG4vKiovXG4vKiBTaW5jZSB0aGUgcmF0aW9zIGFyZSByZXByZXNlbnRlZCBieSBhIG51bWVyYXRvciBhbmQgYSBkZW5vbWluYXRvciwgZXZlcnkqL1xuLyogbXVsdGlwbGljYXRpb24gb3IgZGl2aXNpb24gb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYW4gYW1vdW50IGVuZHMgd2l0aCBhKi9cbi8qIGRpdmlzaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGJpZ2ludHMsIGFuZCBpbnRlZ2VyIGRpdmlzaW9uIHJlcXVpcmVzIGEgbW9kZSovXG4vKiBvZiBbcm91bmRpbmcgdG8gaW50ZWdlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm91bmRpbmcjUm91bmRpbmdfdG9faW50ZWdlcikuKi9cbi8qIEJlY2F1c2UgYFJhdGlvYCBvbmx5IHdvcmsgd2l0aCBOYXR1cmFsIG51bWJlcnMsIGp1c3QgdGhyZWUgbW9kZXMgc3VmZmljZToqL1xuLyogLSBmbG9vciByb3VuZHMgZG93biovXG4vKiAtIGNlaWwgcm91bmRzIHVwKi9cbi8qIC0gZGVmYXVsdCAod2l0aG91dCBwcmVmaXgpIG1pbmltaXplcyBiaWFzIGJ5IHJvdW5kaW5nIGhhbGYgdG8gZXZlbiovXG5cbmNvbnN0IFBFUkNFTlQ9MTAwbjtcblxuY29uc3QgcmF0aW9Qcm9wZXJ0eU5hbWVzPVsnbnVtZXJhdG9yJywnZGVub21pbmF0b3InXTtcblxuY29uc3QgICAgICAgIGFzc2VydElzUmF0aW89KHJhdGlvKT0+e1xuYXNzZXJ0UmVjb3JkKHJhdGlvLCdyYXRpbycpO1xuY29uc3Qga2V5cz1PYmplY3Qua2V5cyhyYXRpbyk7XG5hc3NlcnQoa2V5cy5sZW5ndGg9PT0yLFggYFJhdGlvICR7cmF0aW99IG11c3QgYmUgYSByZWNvcmQgd2l0aCAyIGZpZWxkcy5gKTtcbmZvcihjb25zdCBuYW1lIG9mIGtleXMpe1xucmF0aW9Qcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKG5hbWUpfHxcbmFzc2VydC5mYWlsKFxuWCBgUGFyYW1ldGVyIG11c3QgYmUgYSBSYXRpbyByZWNvcmQsIGJ1dCAke3JhdGlvfSBoYXMgJHtxKG5hbWUpfWApO1xuXG4gfVxuY29uc3QgbnVtZXJhdG9yVmFsdWU9cmF0aW8ubnVtZXJhdG9yLnZhbHVlO1xuY29uc3QgZGVub21pbmF0b3JWYWx1ZT1yYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbmlzTmF0KG51bWVyYXRvclZhbHVlKXx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBudW1lcmF0b3IgdmFsdWUgbXVzdCBiZSBhIE5hdFZhbHVlLCBub3QgJHtudW1lcmF0b3JWYWx1ZX1gKTtcblxuaXNOYXQoZGVub21pbmF0b3JWYWx1ZSl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBUaGUgZGVub21pbmF0b3IgdmFsdWUgbXVzdCBiZSBhIE5hdFZhbHVlLCBub3QgJHtkZW5vbWluYXRvclZhbHVlfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbnVtZXJhdG9yXG4gKiBAcGFyYW0ge0JyYW5kfSBudW1lcmF0b3JCcmFuZFxuICogQHBhcmFtIHtiaWdpbnQ9fSBkZW5vbWluYXRvciBUaGUgZGVmYXVsdCBkZW5vbWluYXRvciBpcyAxMDBcbiAqIEBwYXJhbSB7QnJhbmQ9fSBkZW5vbWluYXRvckJyYW5kIFRoZSBkZWZhdWx0IGlzIHRvIHJldXNlIHRoZSBudW1lcmF0b3JCcmFuZFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5hc3NlcnRJc1JhdGlvKGFzc2VydElzUmF0aW8pO1xuY29uc3QgICAgICAgIG1ha2VSYXRpbz0oXG5udW1lcmF0b3IsXG5udW1lcmF0b3JCcmFuZCxcbmRlbm9taW5hdG9yPVBFUkNFTlQsXG5kZW5vbWluYXRvckJyYW5kPW51bWVyYXRvckJyYW5kKT0+XG57XG5kZW5vbWluYXRvcj4wbnx8XG5hc3NlcnQuZmFpbChcblggYE5vIGluZmluaXRlIHJhdGlvcyEgRGVub21pbmF0b3Igd2FzIDAvJHtxKGRlbm9taW5hdG9yQnJhbmQpfWApO1xuXG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCB0byByZXR1cm4gdHlwZSBiZWNhdXNlIG1ha2UoKSBlbnN1cmVzKi9cbnJldHVybiBoYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudE1hdGgubWFrZShudW1lcmF0b3JCcmFuZCxudW1lcmF0b3IpLFxuZGVub21pbmF0b3I6QW1vdW50TWF0aC5tYWtlKGRlbm9taW5hdG9yQnJhbmQsZGVub21pbmF0b3IpfSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50fSBudW1lcmF0b3JBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBkZW5vbWluYXRvckFtb3VudFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5tYWtlUmF0aW8obWFrZVJhdGlvKTtcbmNvbnN0ICAgICAgICBtYWtlUmF0aW9Gcm9tQW1vdW50cz0obnVtZXJhdG9yQW1vdW50LGRlbm9taW5hdG9yQW1vdW50KT0+e1xuQW1vdW50TWF0aC5jb2VyY2UobnVtZXJhdG9yQW1vdW50LmJyYW5kLG51bWVyYXRvckFtb3VudCk7XG5BbW91bnRNYXRoLmNvZXJjZShkZW5vbWluYXRvckFtb3VudC5icmFuZCxkZW5vbWluYXRvckFtb3VudCk7XG5yZXR1cm4gbWFrZVJhdGlvKFxuLyogQHRzLWV4cGVjdC1lcnJvciB2YWx1ZSBjYW4gYmUgYW55IEFtb3VudFZhbHVlIGJ1dCBtYWtlUmF0aW8oKSBzdXBwb3J0cyBvbmx5IGJpZ2ludCovXG5udW1lcmF0b3JBbW91bnQudmFsdWUsXG5udW1lcmF0b3JBbW91bnQuYnJhbmQsXG5kZW5vbWluYXRvckFtb3VudC52YWx1ZSxcbmRlbm9taW5hdG9yQW1vdW50LmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0geyp9IGRpdmlkZU9wXG4gKi8kaOKAjV9vbmNlLm1ha2VSYXRpb0Zyb21BbW91bnRzKG1ha2VSYXRpb0Zyb21BbW91bnRzKTtcbmNvbnN0IG11bHRpcGx5SGVscGVyPShhbW91bnQscmF0aW8sZGl2aWRlT3ApPT57XG5BbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsYW1vdW50KTtcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xuYXNzZXJ0KFxuYW1vdW50LmJyYW5kPT09cmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG5YIGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIGRlbm9taW5hdG9yICR7cShcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kKVxuIH1gKTtcblxuXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuZGl2aWRlT3AoXG5tdWx0aXBseShhbW91bnQudmFsdWUscmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbnJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG5jb25zdCAgICAgICAgZmxvb3JNdWx0aXBseUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LHJhdGlvLGZsb29yRGl2aWRlKTtcbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRo4oCNX29uY2UuZmxvb3JNdWx0aXBseUJ5KGZsb29yTXVsdGlwbHlCeSk7XG5jb25zdCAgICAgICAgY2VpbE11bHRpcGx5Qnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQscmF0aW8sY2VpbERpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmNlaWxNdWx0aXBseUJ5KGNlaWxNdWx0aXBseUJ5KTtcbmNvbnN0ICAgICAgICBtdWx0aXBseUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LHJhdGlvLGJhbmtlcnNEaXZpZGUpO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0geyp9IGRpdmlkZU9wXG4gKi8kaOKAjV9vbmNlLm11bHRpcGx5QnkobXVsdGlwbHlCeSk7XG5jb25zdCBkaXZpZGVIZWxwZXI9KGFtb3VudCxyYXRpbyxkaXZpZGVPcCk9PntcbkFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCxhbW91bnQpO1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5hc3NlcnQoXG5hbW91bnQuYnJhbmQ9PT1yYXRpby5udW1lcmF0b3IuYnJhbmQsXG5YIGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIG51bWVyYXRvciAke3EoXG5yYXRpby5udW1lcmF0b3IuYnJhbmQpXG4gfWApO1xuXG5cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoXG5yYXRpby5kZW5vbWluYXRvci5icmFuZCxcbmRpdmlkZU9wKFxubXVsdGlwbHkoYW1vdW50LnZhbHVlLHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSxcbnJhdGlvLm51bWVyYXRvci52YWx1ZSkpO1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqL1xuY29uc3QgICAgICAgIGZsb29yRGl2aWRlQnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LHJhdGlvLGZsb29yRGl2aWRlKTtcbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRo4oCNX29uY2UuZmxvb3JEaXZpZGVCeShmbG9vckRpdmlkZUJ5KTtcbmNvbnN0ICAgICAgICBjZWlsRGl2aWRlQnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LHJhdGlvLGNlaWxEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5jZWlsRGl2aWRlQnkoY2VpbERpdmlkZUJ5KTtcbmNvbnN0ICAgICAgICBkaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sYmFua2Vyc0RpdmlkZSk7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UuZGl2aWRlQnkoZGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGludmVydFJhdGlvPShyYXRpbyk9PntcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xuXG5yZXR1cm4gbWFrZVJhdGlvKFxuLyoqIEB0eXBlIHtOYXRWYWx1ZX0gKi9yYXRpby5kZW5vbWluYXRvci52YWx1ZSxcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuLyoqIEB0eXBlIHtOYXRWYWx1ZX0gKi9yYXRpby5udW1lcmF0b3IudmFsdWUsXG5yYXRpby5udW1lcmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5pbnZlcnRSYXRpbyhpbnZlcnRSYXRpbyk7XG5jb25zdCAgICAgICAgYWRkUmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5yaWdodC5udW1lcmF0b3IuYnJhbmQsXG5YIGBudW1lcmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuYXNzZXJ0LmVxdWFsKFxubGVmdC5kZW5vbWluYXRvci5icmFuZCxcbnJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kLFxuWCBgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuXG4vKiBTaW1wbGlmeWluZyB0aGUgZXhwcmVzc2lvbjoqL1xuLyogKGFuZCArIGJuZCkgLyB5IGQqKjIqL1xuLyogKGEgKyBiKSBuZCAvIHkgZCoqMiovXG4vKiAoKGEgKyBiKSBuIC8geSBkKSAqIChkIC8gZCkqL1xuLyogKGEgKyBiKSBuIC8geWQqL1xucmV0dXJuIG1ha2VSYXRpbyhcbmFkZChcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiBhIG5kKi9cbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQubnVtZXJhdG9yLnZhbHVlKS8qIGIgbmQqLyksXG4vKiAoYSArIGIpIG5kKi9cbmxlZnQubnVtZXJhdG9yLmJyYW5kLFxubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksLyogeSBkKioyKi9cbmxlZnQuZGVub21pbmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5hZGRSYXRpb3MoYWRkUmF0aW9zKTtcbmNvbnN0ICAgICAgICBzdWJ0cmFjdFJhdGlvcz0obGVmdCxyaWdodCk9PntcbmFzc2VydElzUmF0aW8ocmlnaHQpO1xuYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcbmFzc2VydC5lcXVhbChcbmxlZnQubnVtZXJhdG9yLmJyYW5kLFxucmlnaHQubnVtZXJhdG9yLmJyYW5kLFxuWCBgbnVtZXJhdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YCk7XG5cbmFzc2VydC5lcXVhbChcbmxlZnQuZGVub21pbmF0b3IuYnJhbmQsXG5yaWdodC5kZW5vbWluYXRvci5icmFuZCxcblggYGRlbm9taW5hdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YCk7XG5cblxucmV0dXJuIG1ha2VSYXRpbyhcbnN1YnRyYWN0KFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIGEgbmQqL1xubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5udW1lcmF0b3IudmFsdWUpLyogYiBuZCovKSxcbi8qIChhIC0gYikgbmQqL1xubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiB5IGQqKjIqL1xubGVmdC5kZW5vbWluYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLnN1YnRyYWN0UmF0aW9zKHN1YnRyYWN0UmF0aW9zKTtcbmNvbnN0ICAgICAgICBtdWx0aXBseVJhdGlvcz0obGVmdCxyaWdodCk9PntcbmFzc2VydElzUmF0aW8ocmlnaHQpO1xuYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcblxuY29uc3QgZ2V0UmVtYWluaW5nQnJhbmRzPSgpPT57XG4vKiBQcmVmZXIgcmVzdWx0cyB0aGF0IGhhdmUgdGhlIHNhbWUgYnJhbmQgYXMgdGhlIGxlZnQgb3BlcmFuZC4qL1xuaWYocmlnaHQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW2xlZnQubnVtZXJhdG9yLmJyYW5kLGxlZnQuZGVub21pbmF0b3IuYnJhbmRdO1xuIH1cbmlmKHJpZ2h0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW2xlZnQubnVtZXJhdG9yLmJyYW5kLHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiB9XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PXJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKXtcbnJldHVybltyaWdodC5udW1lcmF0b3IuYnJhbmQsbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuaWYobGVmdC5udW1lcmF0b3IuYnJhbmQ9PT1sZWZ0LmRlbm9taW5hdG9yLmJyYW5kKXtcbnJldHVybltyaWdodC5udW1lcmF0b3IuYnJhbmQscmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuIH1cbmFzc2VydC5mYWlsKFggYGF0IGxlYXN0IG9uZSBicmFuZCBtdXN0IGNhbmNlbCBvdXQ6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcbiB9O1xuXG5jb25zdFtudW1lcmF0b3JCcmFuZCxkZW5vbWluYXRvckJyYW5kXT1nZXRSZW1haW5pbmdCcmFuZHMoKTtcbnJldHVybiBtYWtlUmF0aW8oXG5tdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSxyaWdodC5udW1lcmF0b3IudmFsdWUpLFxubnVtZXJhdG9yQnJhbmQsXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbmRlbm9taW5hdG9yQnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBJZiByYXRpbyBpcyBiZXR3ZWVuIDAgYW5kIDEsIHN1YnRyYWN0IGZyb20gMS5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5tdWx0aXBseVJhdGlvcyhtdWx0aXBseVJhdGlvcyk7XG5jb25zdCAgICAgICAgb25lTWludXM9KHJhdGlvKT0+e1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5yYXRpby5udW1lcmF0b3IuYnJhbmQ9PT1yYXRpby5kZW5vbWluYXRvci5icmFuZHx8XG5hc3NlcnQuZmFpbChcblggYG9uZU1pbnVzIG9ubHkgc3VwcG9ydHMgcmF0aW9zIHdpdGggYSBzaW5nbGUgYnJhbmQsIGJ1dCAke3JhdGlvLm51bWVyYXRvci5icmFuZH0gZG9lc24ndCBtYXRjaCAke3JhdGlvLmRlbm9taW5hdG9yLmJyYW5kfWApO1xuXG5yYXRpby5udW1lcmF0b3IudmFsdWU8PXJhdGlvLmRlbm9taW5hdG9yLnZhbHVlfHxcbmFzc2VydC5mYWlsKFxuWCBgUGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE6ICR7cmF0aW8ubnVtZXJhdG9yLnZhbHVlfS8ke3JhdGlvLmRlbm9taW5hdG9yLnZhbHVlfWApO1xuXG5yZXR1cm4gbWFrZVJhdGlvKFxuc3VidHJhY3QocmF0aW8uZGVub21pbmF0b3IudmFsdWUscmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbnJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2Uub25lTWludXMob25lTWludXMpO1xuY29uc3QgICAgICAgIHJhdGlvR1RFPShsZWZ0LHJpZ2h0KT0+e1xuaWYobGVmdC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5udW1lcmF0b3IuYnJhbmQpe1xuYXNzZXJ0LmVxdWFsKFxubGVmdC5kZW5vbWluYXRvci5icmFuZCxcbnJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kLFxuWCBgbnVtZXJhdG9yIGJyYW5kcyBtYXRjaCwgYnV0IGRlbm9taW5hdG9yIGJyYW5kcyBkb24ndDogJHtxKGxlZnQpfSAke3EoXG5yaWdodClcbiB9YCk7XG5cbiB9ZWxzZSBpZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xuYXNzZXJ0LmVxdWFsKFxucmlnaHQubnVtZXJhdG9yLmJyYW5kLFxucmlnaHQuZGVub21pbmF0b3IuYnJhbmQsXG5YIGBsZWZ0aGFuZCBicmFuZHMgbWF0Y2gsIGJ1dCByaWdodGhhbmQgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbnJpZ2h0KVxuIH1gKTtcblxuIH1cbnJldHVybiBuYXRTYWZlTWF0aC5pc0dURShcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbm11bHRpcGx5KHJpZ2h0Lm51bWVyYXRvci52YWx1ZSxsZWZ0LmRlbm9taW5hdG9yLnZhbHVlKSk7XG5cbiB9O1xuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByYXRpb3MgYXJlIHRoZSBzYW1lIHZhbHVlcyAoZXF1YWwgb3IgZXF1aXZhbGFudCBtYXkgcmV0dXJuIGZhbHNlKVxuICpcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UucmF0aW9HVEUocmF0aW9HVEUpO1xuY29uc3QgICAgICAgIHJhdGlvc1NhbWU9KGxlZnQscmlnaHQpPT57XG5yZXR1cm4oXG5BbW91bnRNYXRoLmlzRXF1YWwobGVmdC5udW1lcmF0b3IscmlnaHQubnVtZXJhdG9yKSYmXG5BbW91bnRNYXRoLmlzRXF1YWwobGVmdC5kZW5vbWluYXRvcixyaWdodC5kZW5vbWluYXRvcikpO1xuXG4gfTtcblxuLyoqXG4gKiBNYWtlIGFuIGVxdWl2YWxhbnQgcmF0aW8gd2l0aCBhIG5ldyBkZW5vbWluYXRvclxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0ge2JpZ2ludH0gbmV3RGVuXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLnJhdGlvc1NhbWUocmF0aW9zU2FtZSk7XG5jb25zdCAgICAgICAgcXVhbnRpemU9KHJhdGlvLG5ld0Rlbik9PntcbmNvbnN0IG9sZERlbj1yYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbmNvbnN0IG9sZE51bT1yYXRpby5udW1lcmF0b3IudmFsdWU7XG5jb25zdCBuZXdOdW09XG5uZXdEZW49PT1vbGREZW4/b2xkTnVtOmJhbmtlcnNEaXZpZGUob2xkTnVtKm5ld0RlbixvbGREZW4pO1xucmV0dXJuIG1ha2VSYXRpbyhcbm5ld051bSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbm5ld0RlbixcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kKTtcblxuIH07JGjigI1fb25jZS5xdWFudGl6ZShxdWFudGl6ZSk7XG5cbmNvbnN0IE5VTUVSSUNfUkU9L14oXFxkXFxkKikoPzpcXC4oXFxkKikpPyQvO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhdGlvIGZyb20gYSBnaXZlbiBudW1lcmljIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7UGFyc2FibGVOdW1iZXJ9IG51bWVyaWNcbiAqIEBwYXJhbSB7QnJhbmR9IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge0JyYW5kfSBbZGVub21pbmF0b3JCcmFuZF1cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlUmF0aW89KFxubnVtZXJpYyxcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3JCcmFuZD1udW1lcmF0b3JCcmFuZCk9Plxue1xuY29uc3QgbWF0Y2g9IGAke251bWVyaWN9YC5tYXRjaChOVU1FUklDX1JFKTtcbmFzc2VydChtYXRjaCxYIGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtudW1lcmljfWApO1xuXG5jb25zdFt3aG9sZSxwYXJ0PScnXT1bbWF0Y2hbMV0sbWF0Y2hbMl1dO1xucmV0dXJuIG1ha2VSYXRpbyhcbkJpZ0ludCggYCR7d2hvbGV9JHtwYXJ0fWApLFxubnVtZXJhdG9yQnJhbmQsXG4xMG4qKkJpZ0ludChwYXJ0Lmxlbmd0aCksXG5kZW5vbWluYXRvckJyYW5kKTtcblxuIH07XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sqL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBQYXJzYWJsZU51bWJlcn1cbiAqLyRo4oCNX29uY2UucGFyc2VSYXRpbyhwYXJzZVJhdGlvKTtcbmNvbnN0ICAgICAgICBhc3NlcnRQYXJzYWJsZU51bWJlcj0oc3BlY2ltZW4pPT57XG5jb25zdCBtYXRjaD0gYCR7c3BlY2ltZW59YC5tYXRjaChOVU1FUklDX1JFKTtcbmFzc2VydChtYXRjaCxYIGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtzcGVjaW1lbn1gKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFyc2FibGVOdW1iZXIoYXNzZXJ0UGFyc2FibGVOdW1iZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElzUmF0aW8iOlsiYXNzZXJ0SXNSYXRpbyJdLCJtYWtlUmF0aW8iOlsibWFrZVJhdGlvIl0sIm1ha2VSYXRpb0Zyb21BbW91bnRzIjpbIm1ha2VSYXRpb0Zyb21BbW91bnRzIl0sImZsb29yTXVsdGlwbHlCeSI6WyJmbG9vck11bHRpcGx5QnkiXSwiY2VpbE11bHRpcGx5QnkiOlsiY2VpbE11bHRpcGx5QnkiXSwibXVsdGlwbHlCeSI6WyJtdWx0aXBseUJ5Il0sImZsb29yRGl2aWRlQnkiOlsiZmxvb3JEaXZpZGVCeSJdLCJjZWlsRGl2aWRlQnkiOlsiY2VpbERpdmlkZUJ5Il0sImRpdmlkZUJ5IjpbImRpdmlkZUJ5Il0sImludmVydFJhdGlvIjpbImludmVydFJhdGlvIl0sImFkZFJhdGlvcyI6WyJhZGRSYXRpb3MiXSwic3VidHJhY3RSYXRpb3MiOlsic3VidHJhY3RSYXRpb3MiXSwibXVsdGlwbHlSYXRpb3MiOlsibXVsdGlwbHlSYXRpb3MiXSwib25lTWludXMiOlsib25lTWludXMiXSwicmF0aW9HVEUiOlsicmF0aW9HVEUiXSwicmF0aW9zU2FtZSI6WyJyYXRpb3NTYW1lIl0sInF1YW50aXplIjpbInF1YW50aXplIl0sInBhcnNlUmF0aW8iOlsicGFyc2VSYXRpbyJdLCJhc3NlcnRQYXJzYWJsZU51bWJlciI6WyJhc3NlcnRQYXJzYWJsZU51bWJlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWt007wQUAAMEFAAAzAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvbmF0Il0sImV4cG9ydHMiOlsibmF0U2FmZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIFRoZXNlIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSB2YWx1ZXMgb2ZcbiAqIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiBuYXRTYWZlTWF0aCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBhbmQgc28gaXQgbmVlZHMgdG9cbiAqIHZhbGlkYXRlIHRoZSBpbnB1dHMsIGFzIHdlbGwgYXMgdGhlIG91dHB1dHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbmNvbnN0ICAgICAgICBuYXRTYWZlTWF0aD1oYXJkZW4oe1xuLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbmFkZDooeCx5KT0+TmF0KHgpK05hdCh5KSxcbnN1YnRyYWN0Oih4LHkpPT5OYXQoTmF0KHgpLU5hdCh5KSksXG5tdWx0aXBseTooeCx5KT0+TmF0KHgpKk5hdCh5KSxcbmZsb29yRGl2aWRlOih4LHkpPT5OYXQoeCkvTmF0KHkpLFxuY2VpbERpdmlkZTooeCx5KT0+e1xueT1OYXQoeSk7XG5yZXR1cm4gTmF0KE5hdCh4KSt5LTFuKS95O1xuIH0sXG4vKipcbiAqIERpdmlkZSB1c2luZyBoYWxmLXRvLWV2ZW4gKGFrYSBCYW5rZXIncyBSb3VuZGluZykgYXMgaW4gSUVFRSA3NzQgZGVmYXVsdCByb3VuZGluZ1xuICpcbiAqIEBwYXJhbSB7TmF0VmFsdWV9IGFcbiAqIEBwYXJhbSB7TmF0VmFsdWV9IGJcbiAqL1xuYmFua2Vyc0RpdmlkZTooYSxiKT0+e1xuYT1OYXQoYSk7XG5iPU5hdChiKTtcblxuY29uc3QgZGl2PWEvYjtcbmNvbnN0IHJlbT1hJWI7XG4vKiBpZiByZW1haW5kZXIgPiBoYWxmIGRpdmlzb3IsIHNob3VsZCBoYXZlIHJvdW5kZWQgdXAgaW5zdGVhZCBvZiBkb3duLCBzbyBhZGQgMSovXG5pZihyZW0qMm4+Yil7XG5yZXR1cm4gZGl2KzFuO1xuIH1lbHNlIGlmKHJlbSoybj09PWIpe1xuLyogQWRkIDEgaWYgcmVzdWx0IGlzIG9kZCB0byBnZXQgYW4gZXZlbiByZXR1cm4gdmFsdWUqL1xuaWYoZGl2JTJuPT09MW4pcmV0dXJuIGRpdisxbjtcbiB9XG5yZXR1cm4gZGl2O1xuIH0sXG5pc0dURTooeCx5KT0+TmF0KHgpPj1OYXQoeSl9KTskaOKAjV9vbmNlLm5hdFNhZmVNYXRoKG5hdFNhZmVNYXRoKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRTYWZlTWF0aCI6WyJuYXRTYWZlTWF0aCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZWOvfhQQAAIUEAAA3AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VTdGF0ZU1hY2hpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKiBhbGxvd2VkVHJhbnNpdGlvbnMgaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHdoaWNoIGdldHMgdHVybmVkIGludG8gYVxuICogbWFwLiBUaGUgbWFwIG1hcHMgc3RyaW5nIHN0YXRlcyB0byBhbiBhcnJheSBvZiBwb3RlbnRpYWwgbmV4dFxuICogc3RhdGVzLiBGb3IgZXhhbXBsZSxcbiAqIGNvbnN0IGFsbG93ZWRUcmFuc2l0aW9ucyA9IFtcbiBbJ29wZW4nLCBbJ2Nsb3NlZCddXSxcbiBbJ2Nsb3NlZCcsIFtdXSxcbiAqIF07XG4qL1xuY29uc3QgbWFrZVN0YXRlTWFjaGluZT0oaW5pdGlhbFN0YXRlLGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KT0+e1xubGV0IHN0YXRlPWluaXRpYWxTdGF0ZTtcbmNvbnN0IGFsbG93ZWRUcmFuc2l0aW9ucz1uZXcgTWFwKGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KTtcbnJldHVybiBoYXJkZW4oe1xuY2FuVHJhbnNpdGlvblRvOihuZXh0U3RhdGUpPT5cbmFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSksXG50cmFuc2l0aW9uVG86KG5leHRTdGF0ZSk9PntcbmFzc2VydChhbGxvd2VkVHJhbnNpdGlvbnMuZ2V0KHN0YXRlKS5pbmNsdWRlcyhuZXh0U3RhdGUpKTtcbnN0YXRlPW5leHRTdGF0ZTtcbiB9LFxuZ2V0U3RhdHVzOihfKT0+c3RhdGV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RhdGVNYWNoaW5lKG1ha2VTdGF0ZU1hY2hpbmUpO1xuaGFyZGVuKG1ha2VTdGF0ZU1hY2hpbmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdGF0ZU1hY2hpbmUiOlsibWFrZVN0YXRlTWFjaGluZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABAimz3XwUAAF8FAAA1AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNhbGN1bGF0ZU1lZGlhbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFR5cGVkTWF0aFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gVH0gYWRkXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBiaWdpbnQpID0+IFR9IGRpdmlkZVxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gYm9vbGVhbn0gaXNHVEVcbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIGEgc2V0IG9mIHNhbXBsZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtBcnJheTxUPn0gc2FtcGxlcyB0aGUgaW5wdXQgbWVhc3VyZW1lbnRzXG4gKiBAcGFyYW0ge1R5cGVkTWF0aDxUPn0gbWF0aFxuICogQHJldHVybnMge1Q9fSB0aGUgbWVkaWFuICh1bmRlZmluZWQgaWYgbm8gc2FtcGxlcylcbiAqL1xuY29uc3QgICAgICAgIGNhbGN1bGF0ZU1lZGlhbj0oc2FtcGxlcyxtYXRoKT0+e1xuY29uc3Qgc29ydGVkPXNhbXBsZXMuc29ydCgoYSxiKT0+e1xuaWYoIW1hdGguaXNHVEUoYSxiKSl7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZighbWF0aC5pc0dURShiLGEpKXtcbnJldHVybiAxO1xuIH1cbnJldHVybiAwO1xuIH0pO1xuXG5pZihzb3J0ZWQubGVuZ3RoPT09MCl7XG4vKiBObyB2YWxpZCBzYW1wbGVzLCBkb24ndCByZXBvcnQgYW55dGhpbmcuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG5pZihzb3J0ZWQubGVuZ3RoJTIhPT0wKXtcbi8qIE9kZCBsZW5ndGgsIGp1c3QgcGljayB0aGUgbWlkZGxlIGVsZW1lbnQuKi9cbnJldHVybiBzb3J0ZWRbKHNvcnRlZC5sZW5ndGgtMSkvMl07XG4gfVxuXG4vKiBFdmVuIGxlbmd0aCwgdGFrZSB0aGUgbWVhbiBvZiB0aGUgdHdvIG1pZGRsZSB2YWx1ZXMuKi9cbmNvbnN0IHNlY29uZEluZGV4PXNvcnRlZC5sZW5ndGgvMjtcbmNvbnN0IHN1bT1tYXRoLmFkZChzb3J0ZWRbc2Vjb25kSW5kZXgtMV0sc29ydGVkW3NlY29uZEluZGV4XSk7XG5yZXR1cm4gbWF0aC5kaXZpZGUoc3VtLDJuKTtcbiB9OyRo4oCNX29uY2UuY2FsY3VsYXRlTWVkaWFuKGNhbGN1bGF0ZU1lZGlhbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsY3VsYXRlTWVkaWFuIjpbImNhbGN1bGF0ZU1lZGlhbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADK7i8JpgsAAKYLAAAwAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWF0R2FpbnNMb3NzZXNSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gc2VhdFxuICogQHByb3BlcnR5IHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnYWlucyAtIHdoYXQgdGhlIHNlYXQgd2lsbFxuICogZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGlzIHRyYWRlXG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmQ9fSBsb3NzZXMgLSB3aGF0IHRoZSBzZWF0IHdpbGxcbiAqIGdpdmUgdXAgYXMgYSByZXN1bHQgb2YgdGhpcyB0cmFkZS4gTG9zc2VzIGlzIG9wdGlvbmFsLCBidXQgY2FuXG4gKiBvbmx5IGJlIG9taXR0ZWQgaWYgdGhlIGtleXdvcmRzIGZvciBib3RoIHNlYXRzIGFyZSB0aGUgc2FtZS5cbiAqIElmIGxvc3NlcyBpcyBub3QgZGVmaW5lZCwgdGhlIGdhaW5zIG9mIHRoZSBvdGhlciBzZWF0IGlzXG4gKiBzdWJ0cmFjdGVkLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBcbiAqIElmIHR3byBzZWF0cyBjYW4gc2F0aXNmeSBlYWNoIG90aGVyJ3Mgd2FudHMsIHRyYWRlIGVub3VnaCB0b1xuICogc2F0aXNmeSB0aGUgd2FudHMgb2YgYm90aCBzZWF0cyBhbmQgZXhpdCBib3RoIHNlYXRzLlxuICpcbiAqIFRoZSBzdXJwbHVzIHJlbWFpbnMgd2l0aCB0aGUgb3JpZ2luYWwgc2VhdC4gRm9yIGV4YW1wbGUgaWYgc2VhdCBBXG4gKiBnaXZlcyA1IG1vb2xhIGFuZCBzZWF0IEIgb25seSB3YW50cyAzIG1vb2xhLCBzZWF0IEEgcmV0YWlucyAyXG4gKiBtb29sYS5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBUaGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgbXVzdCBtYXRjaC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTd2FwRXhhY3RcbiAqXG4gKiBTd2FwIHN1Y2ggdGhhdCBib3RoIHNlYXRzIGdhaW4gd2hhdCB0aGV5IHdhbnQgYW5kIGxvc2UgZXZlcnl0aGluZ1xuICogdGhhdCB0aGV5IGdhdmUuIE9ubHkgZ29vZCBmb3IgZXhhY3QgYW5kIGVudGlyZSBzd2FwcyB3aGVyZSBlYWNoXG4gKiBzZWF0IHdhbnRzIGV2ZXJ5dGhpbmcgdGhhdCB0aGUgb3RoZXIgc2VhdCBoYXMuIFRoZSBiZW5lZml0IG9mIHVzaW5nXG4gKiB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBrZXl3b3JkcyBvZiBlYWNoIHNlYXQgZG8gbm90IG1hdHRlci5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxLZXl3b3JkPn0gS2V5d29yZEtleXdvcmRSZWNvcmRcbiAqXG4gKiBBIG1hcHBpbmcgb2Yga2V5d29yZHMgdG8ga2V5d29yZHMuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmV2ZXJzZVxuICpcbiAqIEdpdmVuIGEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3JkcywgaW52ZXJ0IHRoZSBrZXlzIGFuZFxuICogdmFsdWVzLiBUaGlzIGlzIHVzZWQgdG8gbWFwIHRoZSBvZmZlcnMgbWFkZSB0byBhbm90aGVyIGNvbnRyYWN0XG4gKiBiYWNrIHRvIHRoZSBrZXl3b3JkcyB1c2VkIGluIHRoZSBmaXJzdCBjb250cmFjdC5cbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmQ9fSBrZXl3b3JkUmVjb3JkXG4gKiBAcmV0dXJucyB7S2V5d29yZEtleXdvcmRSZWNvcmQgfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1hcEtleXdvcmRzXG4gKlxuICogUmVtYXAgdGhlIGtleXdvcmRzIG9mIGFuIGFtb3VudEtleXdvcmRSZWNvcmQsIGlzc3VlcktleXdvcmRSZWNvcmQsIG9yIGFcbiAqIFBheW1lbnRQS2V5d29yZFJlY29yZCBhY2NvcmRpbmcgdG8gYSBtYXBwaW5nLiBUaGlzIGlzIHVzZWQgdG8gcmVtYXBcbiAqIGZyb20ga2V5d29yZHMgdXNlZCBpbiBjb250cmFjdEEgdG8ga2V5d29yZHMgdXNlZCBpbiBjb250cmFjdEIgYW5kXG4gKiB2aWNlIHZlcnNhIGluIGBvZmZlclRvYFxuICpcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZCB8IFBheW1lbnRQS2V5d29yZFJlY29yZCB8IElzc3VlcktleXdvcmRSZWNvcmQgfCB1bmRlZmluZWQgfSBrZXl3b3JkUmVjb3JkXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkfSBrZXl3b3JkTWFwcGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmF0aW9cbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gbnVtZXJhdG9yXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGRlbm9taW5hdG9yXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2NhbGVBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcJocn7joAAO46AAA1AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiY2hlY2taQ0YiLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyIsImZpdFByb3Bvc2FsU2hhcGUiLCJtYXBLZXl3b3JkcyIsIm9mZmVyVG8iLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGZpdCxrZXlFUSxFLG1ha2VQcm9taXNlS2l0LEFzc2V0S2luZCxmcm9tVW5pcXVlRW50cmllcyxzYXRpc2ZpZXNXYW50OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjigI1fYSldXV1dLFtcIi4uL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNcIiwgW1tcInNhdGlzZmllc1dhbnRcIiwgWyRo4oCNX2EgPT4gKHNhdGlzZmllc1dhbnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBkZWZhdWx0QWNjZXB0YW5jZU1zZz0gYFRoZSBvZmZlciBoYXMgYmVlbiBhY2NlcHRlZC4gT25jZSB0aGUgY29udHJhY3QgaGFzIGJlZW4gY29tcGxldGVkLCBwbGVhc2UgY2hlY2sgeW91ciBwYXlvdXRgOyRo4oCNX29uY2UuZGVmYXVsdEFjY2VwdGFuY2VNc2coZGVmYXVsdEFjY2VwdGFuY2VNc2cpO1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgZ2V0S2V5c1NvcnRlZD0ob2JqKT0+aGFyZGVuKFJlZmxlY3Qub3duS2V5cyhvYmp8fHt9KS5zb3J0KCkpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0SXNzdWVyS2V5d29yZHM9KHpjZixleHBlY3RlZCk9PntcbmNvbnN0e2lzc3VlcnN9PXpjZi5nZXRUZXJtcygpO1xuY29uc3QgYWN0dWFsPWdldEtleXNTb3J0ZWQoaXNzdWVycyk7XG5leHBlY3RlZD1bLi4uZXhwZWN0ZWRdOy8qIGluIGNhc2UgaGFyZGVuZWQqL1xuZXhwZWN0ZWQuc29ydCgpO1xua2V5RVEoYWN0dWFsLGhhcmRlbihleHBlY3RlZCkpfHxcbmFzc2VydC5mYWlsKFggYGtleXdvcmRzOiAke2FjdHVhbH0gd2VyZSBub3QgYXMgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaY2ZTZWF0UGFydGlhbFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9wb3NhbFJlY29yZH0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0Q3VycmVudEFsbG9jYXRpb25cbiAqL1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gdXBkYXRlIHRvIGN1cnJlbnRBbGxvY2F0aW9uIHNhdGlzZmllc1xuICogcHJvcG9zYWwud2FudC4gTm90ZSB0aGF0IHRoaXMgaXMgaGFsZiBvZiB0aGUgb2ZmZXIgc2FmZXR5XG4gKiBjaGVjazsgd2hldGhlciB0aGUgYWxsb2NhdGlvbiBjb25zdGl0dXRlcyBhIHJlZnVuZCBpcyBub3RcbiAqIGNoZWNrZWQuIFRoZSB1cGRhdGUgaXMgbWVyZ2VkIHdpdGggY3VycmVudEFsbG9jYXRpb25cbiAqICh1cGRhdGUncyB2YWx1ZXMgcHJldmFpbGluZyBpZiB0aGUga2V5d29yZHMgYXJlIHRoZSBzYW1lKVxuICogdG8gcHJvZHVjZSB0aGUgbmV3QWxsb2NhdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyAwIGZvclxuICogZmFsc2UgYW5kIDEgZm9yIHRydWUuIFdoZW4gbXVsdGlwbGVzIGFyZSBpbnRyb2R1Y2VkLCBhbnlcbiAqIHBvc2l0aXZlIHJldHVybiB2YWx1ZSB3aWxsIG1lYW4gdHJ1ZS5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pjZlNlYXRQYXJ0aWFsfSBzZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IHVwZGF0ZVxuICogQHJldHVybnMgezB8MX1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0SXNzdWVyS2V5d29yZHMoYXNzZXJ0SXNzdWVyS2V5d29yZHMpO1xuY29uc3QgICAgICAgIHNhdGlzZmllcz0oemNmLHNlYXQsdXBkYXRlKT0+e1xuY29uc3QgY3VycmVudEFsbG9jYXRpb249c2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuY29uc3QgbmV3QWxsb2NhdGlvbj17Li4uY3VycmVudEFsbG9jYXRpb24sLi4udXBkYXRlfTtcbmNvbnN0IHByb3Bvc2FsPXNlYXQuZ2V0UHJvcG9zYWwoKTtcbnJldHVybiBzYXRpc2ZpZXNXYW50KHByb3Bvc2FsLG5ld0FsbG9jYXRpb24pO1xuIH07XG5cbi8qKiBAdHlwZSB7U3dhcH0gKi8kaOKAjV9vbmNlLnNhdGlzZmllcyhzYXRpc2ZpZXMpO1xuY29uc3QgICAgICAgIHN3YXA9KHpjZixsZWZ0U2VhdCxyaWdodFNlYXQpPT57XG50cnl7XG5yaWdodFNlYXQuZGVjcmVtZW50QnkoaGFyZGVuKGxlZnRTZWF0LmdldFByb3Bvc2FsKCkud2FudCkpO1xubGVmdFNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKGxlZnRTZWF0LmdldFByb3Bvc2FsKCkud2FudCkpO1xuXG5sZWZ0U2VhdC5kZWNyZW1lbnRCeShoYXJkZW4ocmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudCkpO1xucmlnaHRTZWF0LmluY3JlbWVudEJ5KGhhcmRlbihyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSk7XG5cbnpjZi5yZWFsbG9jYXRlKGxlZnRTZWF0LHJpZ2h0U2VhdCk7XG4gfWNhdGNoKGVycil7XG5sZWZ0U2VhdC5mYWlsKGVycik7XG5yaWdodFNlYXQuZmFpbChlcnIpO1xudGhyb3cgZXJyO1xuIH1cblxubGVmdFNlYXQuZXhpdCgpO1xucmlnaHRTZWF0LmV4aXQoKTtcbnJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbiB9O1xuXG4vKiogQHR5cGUge1N3YXBFeGFjdH0gKi8kaOKAjV9vbmNlLnN3YXAoc3dhcCk7XG5jb25zdCAgICAgICAgc3dhcEV4YWN0PSh6Y2YsbGVmdFNlYXQscmlnaHRTZWF0KT0+e1xudHJ5e1xucmlnaHRTZWF0LmRlY3JlbWVudEJ5KGhhcmRlbihyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSk7XG5sZWZ0U2VhdC5pbmNyZW1lbnRCeShoYXJkZW4obGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSk7XG5cbmxlZnRTZWF0LmRlY3JlbWVudEJ5KGhhcmRlbihsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLmdpdmUpKTtcbnJpZ2h0U2VhdC5pbmNyZW1lbnRCeShoYXJkZW4ocmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudCkpO1xuXG56Y2YucmVhbGxvY2F0ZShsZWZ0U2VhdCxyaWdodFNlYXQpO1xuIH1jYXRjaChlcnIpe1xubGVmdFNlYXQuZmFpbChlcnIpO1xucmlnaHRTZWF0LmZhaWwoZXJyKTtcbnRocm93IGVycjtcbiB9XG5cbmxlZnRTZWF0LmV4aXQoKTtcbnJpZ2h0U2VhdC5leGl0KCk7XG5yZXR1cm4gZGVmYXVsdEFjY2VwdGFuY2VNc2c7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiBFeHBlY3RlZFJlY29yZFxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFt3YW50XVxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFtnaXZlXVxuICogQHByb3BlcnR5IHtQYXJ0aWFsPFJlY29yZDxrZXlvZiBQcm9wb3NhbFJlY29yZFsnZXhpdCddLCBudWxsPj59IFtleGl0XVxuICovXG5cbi8qKlxuICogQ2hlY2sgdGhlIHNlYXQncyBwcm9wb3NhbCBhZ2FpbnN0IGBwcm9wb3NhbFNoYXBlYC5cbiAqIElmIHRoZSBjbGllbnQgc3VibWl0cyBhbiBvZmZlciB3aGljaCBkb2VzIG5vdCBtYXRjaFxuICogdGhlc2UgZXhwZWN0YXRpb25zLCB0aGUgc2VhdCB3aWxsIGJlIGV4aXRlZCAoYW5kIHBheW1lbnRzIHJlZnVuZGVkKS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UGF0dGVybn0gcHJvcG9zYWxTaGFwZVxuICovJGjigI1fb25jZS5zd2FwRXhhY3Qoc3dhcEV4YWN0KTtcbmNvbnN0ICAgICAgICBmaXRQcm9wb3NhbFNoYXBlPShzZWF0LHByb3Bvc2FsU2hhcGUpPT5cbi8qIFRPRE8gcmVtb3ZlIHRoaXMgaGFyZGVuLCBvYmxpZ2F0aW5nIG91ciBjYWxsZXIgdG8gaGFyZGVuLiovXG5maXQoc2VhdC5nZXRQcm9wb3NhbCgpLGhhcmRlbihwcm9wb3NhbFNoYXBlKSwncHJvcG9zYWwnKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYW4gYGV4cGVjdGVkYCByZWNvcmQgdGhhdCBzYXlzXG4gKiB3aGF0IFwic2hhcGVcIiBvZiBwcm9wb3NhbCBpcyBhY2NlcHRhYmxlLlxuICpcbiAqIE5vdGUgdGhhdCBieSBvdXIgY3VycmVudCB0ZXJtaW5vbG9neSwgdGhpcyBmdW5jdGlvbiBpcyBtaXNuYW1lZCBiZWNhdXNlXG4gKiB3ZSB1c2VcbiAqIFtcIlNoYXBlXCIgdG8gcmVmZXIgdG8gcGF0dGVybnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9ibG9iL21hc3Rlci9wYWNrYWdlcy9zdG9yZS9zcmMvdHlwZXMuanMjTDU2LUw3NCksXG4gKiBhbmQgdGhlIGBleHBlY3RlZGAgYXJndW1lbnQgaXMgbm90IHN1Y2ggYSBwYXR0ZXJuLiBSYXRoZXIgaXQgaXMgYW4gYWQtaG9jXG4gKiBwYXR0ZXJuLWxpa2Ugc3BlY2lhbCBjYXNlIHJlY29yZCB0aGF0IGlzIGRpZmZlcmVudCBhbmQgbXVjaCBsZXNzIGV4cHJlc3NpdmUuXG4gKlxuICogVGhpcyBFeHBlY3RlZFJlY29yZCBpcyBsaWtlIGEgUHJvcG9zYWwsIGJ1dCB0aGUgYW1vdW50cyBpbiAnd2FudCdcbiAqIGFuZCAnZ2l2ZScgc2hvdWxkIGJlIG51bGw7IHRoZSBleGl0IGNsYXVzZSBzaG91bGQgc3BlY2lmeSBhIHJ1bGUgd2l0aFxuICogbnVsbCBjb250ZW50cy4gSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBvcHRpb25hbCBgcHJvcG9zYWxTaGFwZWAgYXJndW1lbnQgdG8gYG1ha2VJbnZpdGF0aW9uYCB3aXRoXG4gKiBhIGdlbnVpbmUgcGF0dGVybi5cbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtFeHBlY3RlZFJlY29yZH0gZXhwZWN0ZWRcbiAqLyRo4oCNX29uY2UuZml0UHJvcG9zYWxTaGFwZShmaXRQcm9wb3NhbFNoYXBlKTtcbmNvbnN0ICAgICAgICBhc3NlcnRQcm9wb3NhbFNoYXBlPShzZWF0LGV4cGVjdGVkKT0+e1xuYXNzZXJ0LnR5cGVvZihleHBlY3RlZCwnb2JqZWN0Jyk7XG5hc3NlcnQoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpLCdFeHBlY3RlZCBtdXN0IGJlIGFuIG5vbi1hcnJheSBvYmplY3QnKTtcbmNvbnN0IGFzc2VydFZhbHVlc051bGw9KGUpPT57XG5pZihlIT09dW5kZWZpbmVkKXtcbk9iamVjdC52YWx1ZXMoZSkuZm9yRWFjaCgodmFsdWUpPT5cbmFzc2VydChcbnZhbHVlPT09bnVsbCxcblggYFRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgcmVjb3JkIG11c3QgYmUgbnVsbCBidXQgd2FzICR7dmFsdWV9YCkpO1xuXG5cbiB9XG4gfTtcblxuLyogQXNzZXJ0IHZhbHVlcyBvZiB0aGUgZXhwZWN0ZWQgcmVjb3JkIGFyZSBhbGwgbnVsbC4gV2UgZG8gbm90Ki9cbi8qIGNoZWNrIHRoZSB2YWx1ZXMgb2YgdGhlIGFjdHVhbCBwcm9wb3NhbC4qL1xuYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5naXZlKTtcbmFzc2VydFZhbHVlc051bGwoZXhwZWN0ZWQud2FudCk7XG5hc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmV4aXQpO1xuXG5jb25zdCBhY3R1YWw9c2VhdC5nZXRQcm9wb3NhbCgpO1xuY29uc3QgYXNzZXJ0S2V5cz0oYSxlKT0+e1xuaWYoZSE9PXVuZGVmaW5lZCl7XG5rZXlFUShnZXRLZXlzU29ydGVkKGEpLGdldEtleXNTb3J0ZWQoZSkpfHxcbmFzc2VydC5mYWlsKFggYGFjdHVhbCAke2F9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgJHtlfWApO1xuIH1cbiB9O1xuYXNzZXJ0S2V5cyhhY3R1YWwuZ2l2ZSxleHBlY3RlZC5naXZlKTtcbmFzc2VydEtleXMoYWN0dWFsLndhbnQsZXhwZWN0ZWQud2FudCk7XG5hc3NlcnRLZXlzKGFjdHVhbC5leGl0LGV4cGVjdGVkLmV4aXQpO1xuIH07XG5cbi8qIEdpdmVuIGEgYnJhbmQsIGFzc2VydCB0aGF0IGJyYW5kIGlzIEFzc2V0S2luZC5OQVQuICovJGjigI1fb25jZS5hc3NlcnRQcm9wb3NhbFNoYXBlKGFzc2VydFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIGFzc2VydE5hdEFzc2V0S2luZD0oemNmLGJyYW5kKT0+e1xuYXNzZXJ0KFxuemNmLmdldEFzc2V0S2luZChicmFuZCk9PT1Bc3NldEtpbmQuTkFULFxuJ2JyYW5kIG11c3QgYmUgQXNzZXRLaW5kLk5BVCcpO1xuXG4gfTskaOKAjV9vbmNlLmFzc2VydE5hdEFzc2V0S2luZChhc3NlcnROYXRBc3NldEtpbmQpO1xuXG5jb25zdCAgICAgICAgZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c9IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24gc3VjY2Vzc2Z1bC5gO1xuXG4vKipcbiAqIERlcG9zaXQgcGF5bWVudHMgc3VjaCB0aGF0IHRoZWlyIGFtb3VudHMgYXJlIHJlYWxsb2NhdGVkIHRvIGEgc2VhdC5cbiAqIFRoZSBgYW1vdW50c2AgYW5kIGBwYXltZW50c2AgcmVjb3JkcyBtdXN0IGhhdmUgY29ycmVzcG9uZGluZ1xuICoga2V5d29yZHMuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSByZWNpcGllbnRTZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudHNcbiAqIEBwYXJhbSB7UGF5bWVudFBLZXl3b3JkUmVjb3JkfSBwYXltZW50c1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmBcbiAqLyRo4oCNX29uY2UuZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2coZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2cpO1xuY29uc3QgICAgICAgIGRlcG9zaXRUb1NlYXQ9YXN5bmMoemNmLHJlY2lwaWVudFNlYXQsYW1vdW50cyxwYXltZW50cyk9PntcbmFzc2VydCghcmVjaXBpZW50U2VhdC5oYXNFeGl0ZWQoKSwnVGhlIHJlY2lwaWVudFNlYXQgY2Fubm90IGhhdmUgZXhpdGVkLicpO1xuXG4vKiBXZSB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBvZmZlciB0byBiZSBhYmxlIHRvIGVzY3JvdyBvdXIgcGF5bWVudHMqL1xuLyogd2l0aCBab2UuKi9cbmNvbnN0IHJlYWxsb2NhdGVBZnRlckRlcG9zaXQ9KHRlbXBTZWF0KT0+e1xuLyogQWZ0ZXIgdGhlIGFzc2V0cyBhcmUgZGVwb3NpdGVkLCByZWFsbG9jYXRlIHRoZW0gb250byB0aGUgcmVjaXBpZW50IHNlYXQgYW5kKi9cbi8qIGV4aXQgdGhlIHRlbXBvcmFyeSBzZWF0LiBOb3RlIHRoYXQgdGhlIG9mZmVyUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyovXG4vKiBmdW5jdGlvbiwgc28gdGhpcyBzeW5jaHJvbm91cyB0cmFkZSBtdXN0IGhhcHBlbiBiZWZvcmUgdGhlKi9cbi8qIG9mZmVyUmVzdWx0IHJlc29sdmVzLiovXG50ZW1wU2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oYW1vdW50cykpO1xucmVjaXBpZW50U2VhdC5pbmNyZW1lbnRCeShoYXJkZW4oYW1vdW50cykpO1xuemNmLnJlYWxsb2NhdGUodGVtcFNlYXQscmVjaXBpZW50U2VhdCk7XG50ZW1wU2VhdC5leGl0KCk7XG5yZXR1cm4gZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c7XG4gfTtcbmNvbnN0IGludml0YXRpb249emNmLm1ha2VJbnZpdGF0aW9uKFxucmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCxcbid0ZW1wb3Jhcnkgc2VhdCBmb3IgZGVwb3NpdCcpO1xuXG5jb25zdCBwcm9wb3NhbD1oYXJkZW4oe2dpdmU6YW1vdW50c30pO1xuaGFyZGVuKHBheW1lbnRzKTtcbi8qIFRvIGVzY3JvdyB0aGUgcGF5bWVudCwgd2UgbXVzdCBnZXQgdGhlIFpvZSBTZXJ2aWNlIGZhY2V0IGFuZCovXG4vKiBtYWtlIGFuIG9mZmVyKi9cbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xuY29uc3QgdGVtcFVzZXJTZWF0PUUoem9lKS5vZmZlcihpbnZpdGF0aW9uLHByb3Bvc2FsLHBheW1lbnRzKTtcbi8qIFRoaXMgd2lsbCBiZSBhIHByb21pc2UgZm9yIHRoZSBzdHJpbmc6IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24qL1xuLyogc3VjY2Vzc2Z1bC5gIEl0IHdpbGwgb25seSBmdWxmaWxsIGFmdGVyIHRoZSBhc3NldHMgaGF2ZSBiZWVuKi9cbi8qIHN1Y2Nlc3NmdWxseSByZWFsbG9jYXRlZCB0byB0aGUgcmVjaXBpZW50IHNlYXQuKi9cbnJldHVybiBFKHRlbXBVc2VyU2VhdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcbiB9O1xuXG4vKipcbiAqIFdpdGhkcmF3IHBheW1lbnRzIGZyb20gYSBzZWF0LiBOb3RlIHRoYXQgd2l0aGRyYXdpbmcgdGhlIGFtb3VudHMgb2ZcbiAqIHRoZSBwYXltZW50cyBtdXN0IG5vdCBhbmQgY2Fubm90IHZpb2xhdGUgb2ZmZXIgc2FmZXR5IGZvciB0aGUgc2VhdC4gVGhlXG4gKiBgYW1vdW50c2AgYW5kIGBwYXltZW50c2AgcmVjb3JkcyBtdXN0IGhhdmUgY29ycmVzcG9uZGluZyBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFBLZXl3b3JkUmVjb3JkPn1cbiAqLyRo4oCNX29uY2UuZGVwb3NpdFRvU2VhdChkZXBvc2l0VG9TZWF0KTtcbmNvbnN0ICAgICAgICB3aXRoZHJhd0Zyb21TZWF0PWFzeW5jKHpjZixzZWF0LGFtb3VudHMpPT57XG5hc3NlcnQoIXNlYXQuaGFzRXhpdGVkKCksJ1RoZSBzZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC4nKTtcbmNvbnN0e3pjZlNlYXQ6dGVtcFNlYXQsdXNlclNlYXQ6dGVtcFVzZXJTZWF0UH09emNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbnNlYXQuZGVjcmVtZW50QnkoaGFyZGVuKGFtb3VudHMpKTtcbnRlbXBTZWF0LmluY3JlbWVudEJ5KGhhcmRlbihhbW91bnRzKSk7XG56Y2YucmVhbGxvY2F0ZSh0ZW1wU2VhdCxzZWF0KTtcbnRlbXBTZWF0LmV4aXQoKTtcbnJldHVybiBFKHRlbXBVc2VyU2VhdFApLmdldFBheW91dHMoKTtcbiB9O1xuXG4vKipcbiAqIFNhdmUgYWxsIG9mIHRoZSBpc3N1ZXJzIGluIGFuIGlzc3VlcnNLZXl3b3JkUmVjb3JkIHRvIFpDRiwgdXNpbmdcbiAqIHRoZSBtZXRob2QgYHpjZi5zYXZlSXNzdWVyYC4gVGhpcyBkb2VzIG5vdCBlcnJvciBpZiBhbnkgb2YgdGhlIGtleXdvcmRzXG4gKiBhbHJlYWR5IGV4aXN0LiBJZiB0aGUga2V5d29yZCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IGlzIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSBpc3N1ZXJLZXl3b3JkUmVjb3JkIElzc3VlcnMgdG8gc2F2ZSB0b1xuICogWkNGXG4gKi8kaOKAjV9vbmNlLndpdGhkcmF3RnJvbVNlYXQod2l0aGRyYXdGcm9tU2VhdCk7XG5jb25zdCAgICAgICAgc2F2ZUFsbElzc3VlcnM9YXN5bmMoemNmLGlzc3VlcktleXdvcmRSZWNvcmQ9aGFyZGVuKHt9KSk9PntcbmNvbnN0e2lzc3VlcnN9PXpjZi5nZXRUZXJtcygpO1xuY29uc3QgaXNzdWVyc1BTYXZlZD1PYmplY3QuZW50cmllcyhpc3N1ZXJLZXl3b3JkUmVjb3JkKS5tYXAoXG4oW2tleXdvcmQsaXNzdWVyXSk9Pntcbi8qIElmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHlldCBleGlzdCwgYWRkIGl0IGFuZCB0aGUqL1xuLyogYXNzb2NpYXRlZCBpc3N1ZXIuKi9cbmlmKGlzc3VlcnNba2V5d29yZF09PT11bmRlZmluZWQpe1xucmV0dXJuIHpjZi5zYXZlSXNzdWVyKGlzc3VlcixrZXl3b3JkKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0pO1xuXG5yZXR1cm4gUHJvbWlzZS5hbGwoaXNzdWVyc1BTYXZlZCk7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXBLZXl3b3Jkc30gKi8kaOKAjV9vbmNlLnNhdmVBbGxJc3N1ZXJzKHNhdmVBbGxJc3N1ZXJzKTtcbmNvbnN0ICAgICAgICBtYXBLZXl3b3Jkcz0oa2V5d29yZFJlY29yZD17fSxrZXl3b3JkTWFwcGluZyk9PntcbnJldHVybiBoYXJkZW4oXG5mcm9tVW5pcXVlRW50cmllcyhcbk9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleXdvcmQsdmFsdWVdKT0+e1xuaWYoa2V5d29yZE1hcHBpbmdba2V5d29yZF09PT11bmRlZmluZWQpe1xucmV0dXJuW2tleXdvcmQsdmFsdWVdO1xuIH1cbnJldHVybltrZXl3b3JkTWFwcGluZ1trZXl3b3JkXSx2YWx1ZV07XG4gfSkpKTtcblxuXG4gfTtcbi8qKiBAdHlwZSB7UmV2ZXJzZX0gKi8kaOKAjV9vbmNlLm1hcEtleXdvcmRzKG1hcEtleXdvcmRzKTtcbmNvbnN0IHJldmVyc2U9KGtleXdvcmRSZWNvcmQ9e30pPT57XG5yZXR1cm4gaGFyZGVuKFxuZnJvbVVuaXF1ZUVudHJpZXMoXG5PYmplY3QuZW50cmllcyhrZXl3b3JkUmVjb3JkKS5tYXAoKFtrZXksdmFsdWVdKT0+W3ZhbHVlLGtleV0pKSk7XG5cblxuIH07XG5cbi8qKlxuICogTWFrZSBhbiBvZmZlciB0byBhbm90aGVyIGNvbnRyYWN0IGluc3RhbmNlIChsYWJlbGVkIGNvbnRyYWN0QiBiZWxvdyksXG4gKiB3aXRoZHJhd2luZyB0aGUgcGF5bWVudHMgZm9yIHRoZSBvZmZlciBmcm9tIGEgc2VhdCBpbiB0aGUgY3VycmVudFxuICogY29udHJhY3QgaW5zdGFuY2UgKGNvbnRyYWN0QSkgYW5kIGRlcG9zaXRpbmcgdGhlIHBheW91dHMgaW4gYW5vdGhlclxuICogc2VhdCBpbiB0aGUgY3VycmVudCBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKS5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiAgIFpvZSBDb250cmFjdCBGYWNldCBmb3IgY29udHJhY3RBXG4gKlxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj59IGludml0YXRpb25cbiAqICAgSW52aXRhdGlvbiB0byBjb250cmFjdEJcbiAqXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkfSBrZXl3b3JkTWFwcGluZ1xuICogICBNYXBwaW5nIG9mIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHRvIGJlIHVzZWQgaW5cbiAqICAgY29udHJhY3RCLiBOb3RlIHRoYXQgdGhlIHBhdGh3YXkgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IGJhY2sgdG9cbiAqICAgY29udHJhY3RBIHJldmVyc2VzIHRoaXMgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsfSBwcm9wb3NhbFxuICogICBUaGUgcHJvcG9zYWwgZm9yIHRoZSBvZmZlciB0byBiZSBtYWRlIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqICAgVGhlIHNlYXQgaW4gY29udHJhY3RBIHRvIHRha2UgdGhlIG9mZmVyIHBheW1lbnRzIGZyb20uXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0PX0gW3RvU2VhdD1mcm9tU2VhdF1cbiAqICAgVGhlIHNlYXQgaW4gY29udHJhY3RBIHRvIGRlcG9zaXQgdGhlIHBheW91dCBvZiB0aGUgb2ZmZXIgdG8uXG4gKiAgIElmIGB0b1NlYXRgIGlzIG5vdCBwcm92aWRlZCwgdGhpcyBkZWZhdWx0cyB0byB0aGUgYGZyb21TZWF0YC5cbiAqXG4gKiBAcGFyYW0ge0FyZ3N9IFtvZmZlckFyZ3NdXG4gKiAgIEFkZGl0aW9uYWwgY29udHJhY3Qtc3BlY2lmaWMgb3B0aW9uYWwgYXJndW1lbnRzIGluIGEgcmVjb3JkLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHt1c2VyU2VhdFByb21pc2U6IFByb21pc2U8VXNlclNlYXQ8UmVzdWx0Pj4sIGRlcG9zaXRlZDogUHJvbWlzZTxBbW91bnRLZXl3b3JkUmVjb3JkPn0+fVxuICogICBBIHByb21pc2UgZm9yIHRoZSB1c2VyU2VhdCBmb3IgdGhlIG9mZmVyIHRvIHRoZSBvdGhlciBjb250cmFjdCwgYW5kIGFcbiAqICAgcHJvbWlzZSAoYGRlcG9zaXRlZGApIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBheW91dCBmb3IgdGhlIG9mZmVyIGhhcyBiZWVuXG4gKiAgIGRlcG9zaXRlZCB0byB0aGUgYHRvU2VhdGAuXG4gKiAgIEFueSBmYWlsdXJlcyBvZiB0aGUgaW52aXRhdGlvbiB3aWxsIGJlIHJldHVybmVkIGJ5IGB1c2VyU2VhdFByb21pc2UuZ2V0T2ZmZXJSZXN1bHQoKWAuXG4gKlxuICogQHRlbXBsYXRlIHtvYmplY3Q9fSBBcmdzIE9mZmVyIGFyZ3NcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0PX0gUmVzdWx0IE9mZmVyIHJlc3VsdFxuICovXG5jb25zdCAgICAgICAgb2ZmZXJUbz1hc3luYyhcbnpjZixcbmludml0YXRpb24sXG5rZXl3b3JkTWFwcGluZyxcbnByb3Bvc2FsLFxuZnJvbVNlYXQsXG50b1NlYXQsXG5vZmZlckFyZ3MpPT5cbntcbmlmKGtleXdvcmRNYXBwaW5nPT09dW5kZWZpbmVkKXtcbmtleXdvcmRNYXBwaW5nPWhhcmRlbih7fSk7XG4gfVxuXG5jb25zdCBkZWZpbmVkVG9TZWF0PXRvU2VhdCE9PXVuZGVmaW5lZD90b1NlYXQ6ZnJvbVNlYXQ7XG5cbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xuY29uc3QgbWFwcGluZ1JldmVyc2VkPXJldmVyc2Uoa2V5d29yZE1hcHBpbmcpO1xuXG5jb25zdCBuZXdLZXl3b3Jkcz1cbnByb3Bvc2FsIT09dW5kZWZpbmVkP1xubWFwS2V5d29yZHMocHJvcG9zYWwuZ2l2ZSxtYXBwaW5nUmV2ZXJzZWQpOlxuaGFyZGVuKHt9KTtcblxuLyogdGhlIHByb3Bvc2FsIGlzIGluIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzLCBidXQgd2Ugd2FudCB0byovXG4vKiB1c2UgYHByb3Bvc2FsLmdpdmVgIHRvIHdpdGhkcmF3Ki9cbmNvbnN0IHBheW1lbnRzPWF3YWl0IHdpdGhkcmF3RnJvbVNlYXQoemNmLGZyb21TZWF0LG5ld0tleXdvcmRzKTtcblxuLyogTWFwIHRvIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzKi9cbmNvbnN0IHBheW1lbnRzRm9yT3RoZXJDb250cmFjdD1tYXBLZXl3b3JkcyhwYXltZW50cyxrZXl3b3JkTWFwcGluZyk7XG5cbmNvbnN0IHVzZXJTZWF0UHJvbWlzZT1FKHpvZSkub2ZmZXIoXG5pbnZpdGF0aW9uLFxucHJvcG9zYWwsXG5wYXltZW50c0Zvck90aGVyQ29udHJhY3QsXG5vZmZlckFyZ3MpO1xuXG5cbmNvbnN0IGRlcG9zaXRlZFByb21pc2VLaXQ9bWFrZVByb21pc2VLaXQoKTtcblxuY29uc3QgZG9EZXBvc2l0PWFzeW5jKHBheW91dFBheW1lbnRzKT0+e1xuLyogYWZ0ZXIgZ2V0UGF5b3V0cygpLCBnZXRGaW5hbEFsbG9jYXRpb24oKSByZXNvbHZlcyBwcm9tcHRseS4qL1xuY29uc3QgYW1vdW50cz1hd2FpdCBFKHVzZXJTZWF0UHJvbWlzZSkuZ2V0RmluYWxBbGxvY2F0aW9uKCk7XG5cbi8qIE1hcCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250cmFjdCdzIGtleXdvcmRzKi9cbmNvbnN0IG1hcHBlZEFtb3VudHM9bWFwS2V5d29yZHMoYW1vdW50cyxtYXBwaW5nUmV2ZXJzZWQpO1xuY29uc3QgbWFwcGVkUGF5bWVudHM9bWFwS2V5d29yZHMocGF5b3V0UGF5bWVudHMsbWFwcGluZ1JldmVyc2VkKTtcbmF3YWl0IGRlcG9zaXRUb1NlYXQoemNmLGRlZmluZWRUb1NlYXQsbWFwcGVkQW1vdW50cyxtYXBwZWRQYXltZW50cyk7XG5kZXBvc2l0ZWRQcm9taXNlS2l0LnJlc29sdmUobWFwcGVkQW1vdW50cyk7XG4gfTtcblxuRSh1c2VyU2VhdFByb21pc2UpLmdldFBheW91dHMoKS50aGVuKGRvRGVwb3NpdCk7XG5cbi8qIFRPRE8gcmVuYW1lIHJldHVybiBrZXk7IHVzZXJTZWF0UHJvbWlzZSBpcyBhIHJlbW90ZSBVc2VyU2VhdCovXG5yZXR1cm4gaGFyZGVuKHt1c2VyU2VhdFByb21pc2UsZGVwb3NpdGVkOmRlcG9zaXRlZFByb21pc2VLaXQucHJvbWlzZX0pO1xuIH07XG5cbi8qKlxuICogQ3JlYXRlIGEgd3JhcHBlZCB2ZXJzaW9uIG9mIHpjZiB0aGF0IGFzc2VydHMgYW4gaW52YXJpYW50XG4gKiBiZWZvcmUgcGVyZm9ybWluZyBhIHJlYWxsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0geyhzZWF0czogWkNGU2VhdFtdKSA9PiB2b2lkfSBhc3NlcnRGbiAtIGFuIGFzc2VydGlvblxuICogdGhhdCBtdXN0IGJlIHRydWUgZm9yIHRoZSByZWFsbG9jYXRlIHRvIG9jY3VyXG4gKiBAcmV0dXJucyB7WkNGfVxuICovJGjigI1fb25jZS5vZmZlclRvKG9mZmVyVG8pO1xuY29uc3QgICAgICAgIGNoZWNrWkNGPSh6Y2YsYXNzZXJ0Rm4pPT57XG5jb25zdCBjaGVja2VkWkNGPWhhcmRlbih7XG4uLi56Y2YsXG5yZWFsbG9jYXRlOiguLi5zZWF0cyk9PntcbmFzc2VydEZuKHNlYXRzKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHR5cGVzIGFyZW4ndCByaWdodCBmb3Igc3ByZWFkaW5nKi9cbnpjZi5yZWFsbG9jYXRlKC4uLnNlYXRzKTtcbiB9fSk7XG5cbnJldHVybiBjaGVja2VkWkNGO1xuIH07JGjigI1fb25jZS5jaGVja1pDRihjaGVja1pDRik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyJdLCJzd2FwIjpbInN3YXAiXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCJdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiXSwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciOlsiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0Il0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCJdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyJdLCJtYXBLZXl3b3JkcyI6WyJtYXBLZXl3b3JkcyJdLCJvZmZlclRvIjpbIm9mZmVyVG8iXSwiY2hlY2taQ0YiOlsiY2hlY2taQ0YiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKi8gPHJlZmVyZW5jZSBwYXRoPVwiaW5kZXguZC50c1wiIC8+Ki9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG5hc3NlcnQuZXF1YWwoXG50aGlzLFxucmVjZWl2ZXIsXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoeCl9KWApO1xuXG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAotScywoCAAAKAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4rOx3dgPAADYDwAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9KGVudi5ERUJVR3x8JycpLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4gV2UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhZnRlciB2ZXJpZnlpbmcgdGhhdCBoYXZpbmcqL1xuLyogdGhlIGZlYXR1cmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uIGRvZXMgbm90IGNhdXNlIG1lbW9yeSB0byBsZWFrLiovXG5jb25zdCBFTkFCTEVEPWVudi5UUkFDS19UVVJOUz09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlc2UgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPShmdW5jLHNlbmRpbmdFcnJvcixYKT0+KC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiBoYXJkZW4ocmVzdWx0KTtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAITWh/C/EAAAvxAAAB0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzIiwiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanMiLCIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJQQVNTX1NUWUxFIiwiUUNMQVNTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiIsImFzc2VydENoZWNrZXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImRlY29kZVRvSnVzdGluIiwiZGVlcGx5RnVsZmlsbGVkIiwiZmlsdGVySXRlcmFibGUiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0SW50ZXJmYWNlT2YiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNDb3B5QXJyYXkiLCJpc09iamVjdCIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiLCJtYWtlTWFyc2hhbCIsIm1ha2VUYWdnZWQiLCJtYXBJdGVyYWJsZSIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhcnNlIiwicGFzc1N0eWxlT2YiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJzdHJpbmdpZnkiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanNcIiwgW1tcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFwSXRlcmFibGVcIl1dXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcImZpbHRlckl0ZXJhYmxlXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9saXZlW1wiUEFTU19TVFlMRVwiXV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9saXZlW1wiaXNPYmplY3RcIl1dXSxbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0Q2hlY2tlclwiXV1dLFtcImdldFRhZ1wiLCBbJGjigI1fbGl2ZVtcImdldFRhZ1wiXV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2xpdmVbXCJoYXNPd25Qcm9wZXJ0eU9mXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9saXZlW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiXV1dLFtcInRvUGFzc2FibGVFcnJvclwiLCBbJGjigI1fbGl2ZVtcInRvUGFzc2FibGVFcnJvclwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9saXZlW1wiZ2V0SW50ZXJmYWNlT2ZcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2xpdmVbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIl1dXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2xpdmVbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIl1dXV1dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fbGl2ZVtcInBhc3NTdHlsZU9mXCJdXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRQYXNzYWJsZVwiXV1dXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2xpdmVbXCJkZWVwbHlGdWxmaWxsZWRcIl1dXV1dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlVGFnZ2VkXCJdXV1dXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbW1wiUmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiUmVtb3RhYmxlXCJdXV0sW1wiRmFyXCIsIFskaOKAjV9saXZlW1wiRmFyXCJdXV0sW1wiVG9GYXJGdW5jdGlvblwiLCBbJGjigI1fbGl2ZVtcIlRvRmFyRnVuY3Rpb25cIl1dXV1dLFtcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9saXZlW1wiUUNMQVNTXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VNYXJzaGFsXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbW1wic3RyaW5naWZ5XCIsIFskaOKAjV9saXZlW1wic3RyaW5naWZ5XCJdXV0sW1wicGFyc2VcIiwgWyRo4oCNX2xpdmVbXCJwYXJzZVwiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW1tcImRlY29kZVRvSnVzdGluXCIsIFskaOKAjV9saXZlW1wiZGVjb2RlVG9KdXN0aW5cIl1dXV1dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcImFzc2VydFJlY29yZFwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFJlY29yZFwiXV1dLFtcImFzc2VydENvcHlBcnJheVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENvcHlBcnJheVwiXV1dLFtcImFzc2VydFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFJlbW90YWJsZVwiXV1dLFtcImlzUmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiaXNSZW1vdGFibGVcIl1dXSxbXCJpc1JlY29yZFwiLCBbJGjigI1fbGl2ZVtcImlzUmVjb3JkXCJdXV0sW1wiaXNDb3B5QXJyYXlcIiwgWyRo4oCNX2xpdmVbXCJpc0NvcHlBcnJheVwiXV1dXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiLGZhbHNlXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiLGZhbHNlXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIixmYWxzZV0sImlzT2JqZWN0IjpbImlzT2JqZWN0IixmYWxzZV0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciIsZmFsc2VdLCJnZXRUYWciOlsiZ2V0VGFnIixmYWxzZV0sImhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiIsZmFsc2VdLCJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiLGZhbHNlXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciIsZmFsc2VdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiIsZmFsc2VdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIixmYWxzZV0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLGZhbHNlXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiLGZhbHNlXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiLGZhbHNlXSwiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCIsZmFsc2VdLCJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiLGZhbHNlXSwiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSIsZmFsc2VdLCJGYXIiOlsiRmFyIixmYWxzZV0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiIsZmFsc2VdLCJRQ0xBU1MiOlsiUUNMQVNTIixmYWxzZV0sIm1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIixmYWxzZV0sInN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiLGZhbHNlXSwicGFyc2UiOlsicGFyc2UiLGZhbHNlXSwiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iLGZhbHNlXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCIsZmFsc2VdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5IixmYWxzZV0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiLGZhbHNlXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiLGZhbHNlXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiLGZhbHNlXSwiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqjT9gkIMAABCDAAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBlaXRoZXIgYSByZXBsYWNlbWVudCBQYXNzYWJsZSwgb3IgYSBwcm9taXNlIGZvciB0aGF0XG4gKiByZXBsYWNlbWVudCwgd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBwYXNzYWJsZXMgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtFUmVmPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD0odmFsKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuIHZhbDtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgbmFtZXM9b3duS2V5cyh2YWwpO1xuY29uc3QgdmFsUHM9bmFtZXMubWFwKChuYW1lKT0+ZGVlcGx5RnVsZmlsbGVkKHZhbFtuYW1lXSkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCB2YWxQcz12YWwubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+aGFyZGVuKHZhbHMpKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xucmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodmFsLnBheWxvYWQpLChwYXlsb2FkKT0+XG5tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKSk7XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADDAhnAKQAAACkAAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9XG5pZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJue1xuW1FDTEFTU106J2JpZ2ludCcsXG5kaWdpdHM6U3RyaW5nKHBhc3NhYmxlKX07XG5cbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJue1xuW1FDTEFTU106J3N5bWJvbCcsXG5uYW1lfTtcblxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSxRQ0xBU1MpKXtcbi8qIEhpbGJlcnQgaG90ZWwqL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiogQHR5cGUge0VuY29kaW5nfSAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4vKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbi8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4vKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbi8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xucmVzdWx0LnJlc3Q9ZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltuYW1lLGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuW1FDTEFTU106J3RhZ2dlZCcsXG50YWc6Z2V0VGFnKHBhc3NhYmxlKSxcbnBheWxvYWQ6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxucGFzc2FibGUsXG5lbmNvZGVUb0NhcERhdGFSZWN1cik7XG5cbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG57fSk9PntcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKFxucWNsYXNzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWApO1xuXG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG5hc3NlcnQudHlwZW9mKFxuZGlnaXRzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWApO1xuXG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4vKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG5jb25zdCBkZWNvZGVkPWRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbi8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4vKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4vKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4vKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBkZWNvZGVkPWRlY29kZUVycm9yRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuaWYocGFzc1N0eWxlT2YoZGVjb2RlZCk9PT0nZXJyb3InKXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaXNOb25FbXB0eU9iamVjdHx8XG5GYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMAaDCF5PQAAeT0AAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBTbWFsbGNhcHNFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlXG4gKiB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogQXQgdGhlIHNtYWxsY2FwcyBsZXZlbCwgd2UgcHJlZml4IHN5bWJvbCBuYW1lcyB3aXRoIGAlYC4qL1xuLyogQnkgXCJzeW1ib2wgbmFtZVwiLCB3ZSBtZWFuIGFjY29yZGluZyB0byBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCovXG4vKiB3aGljaCBkb2VzIHNvbWUgZnVydGhlciBlc2NhcGluZy4gU2VlIGNvbW1lbnQgb24gdGhhdCBmdW5jdGlvbi4qL1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfVxuaWYoaXMocGFzc2FibGUsLTApKXtcbnJldHVybiAwO1xuIH1cbmlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIEFsbCBvdGhlciBudW1iZXJzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gcGFzc2FibGU8MG4/c3RyOiBgKyR7c3RyfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJCcpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKHJlc3VsdCwnI2Vycm9yJykpe1xuY29uc3QgbWVzc2FnZT1yZXN1bHRbJyNlcnJvciddO1xuaWYoXG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4vKiBjaGVjayB0aGF0IGl0IGRlY29kZXMgdG8gYSBzdHJpbmcqL1xuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKSlcbntcbnJldHVybiByZXN1bHQ7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKFxubWVzc2FnZSlcbiB9YDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbnJlc3VsdClcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShyZXN1bHQpfWA7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfVxuY2FzZScrJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApsoXZOgGAADoBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5QXJyYXlIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj1jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJOHBWHTBwAA0wcAAC4AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHZhbHVlcyxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxuZm9yKGNvbnN0IGtleSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY29uc3QgdmFsaWQ9XG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuaWYoIXZhbGlkKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xudmFsdWVzKGNhbmRpZGF0ZSkuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvciB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGNhbkJlVmFsaWRgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5pZighKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuIH1cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5pZighRUN8fEVDLnByb3RvdHlwZSE9PXByb3RvKXtcbmNvbnN0IG5vdGU9WCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5cbmNvbnN0e1xuLyogTXVzdCBhbGxvdyBgY2F1c2VgLCBgZXJyb3JzYCovXG5tZXNzYWdlOm1EZXNjLFxuLyogQWxsb3cgYnV0IGlnbm9yZSBvbmx5IGV4dHJhbmVvdXMgb3duIGBzdGFja2AgcHJvcGVydHkuKi9cbnN0YWNrOl9vcHRTdGFja0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD49MSl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydGllcyAke3Jlc3REZXNjc31gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbmlmKG1EZXNjKXtcbmlmKHR5cGVvZiBtRGVzYy52YWx1ZSE9PSdzdHJpbmcnKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5pZihtRGVzYy5lbnVtZXJhYmxlKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRMbrZRggAAEYIAAAwAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcblxuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTpcblxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgYWN0dWFsPW9ialtQQVNTX1NUWUxFXTtcbnJldHVybihcbmFjdHVhbD09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpJiZcblxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcblxuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5wcm90byE9PW51bGwmJmdldFByb3RvdHlwZU9mKHByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soXG5mYWxzZSxcblggYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABPJsPvYfAAD2HwAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc09iamVjdChjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuXG4gfWVsc2UgaWYoaXNBcnJheShjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbmNvbnN0IGtleXM9b3duS2V5cyhkZXNjcyk7XG5yZXR1cm4ga2V5cy5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxuY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtuYW1lOm5hbWVEZXNjLGxlbmd0aDpsZW5ndGhEZXNjLC4uLnJlc3REZXNjc309ZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfWVsc2V7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gKTtcbiB9XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABTGqsGKDwAAig8AADAAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9bmV3IE1hcChcbm93bktleXMoU3ltYm9sKS5cbmZpbHRlcihcbihuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyYmdHlwZW9mIFN5bWJvbFtuYW1lXT09PSdzeW1ib2wnKS5cblxuZmlsdGVyKChuYW1lKT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbkZhaWwgYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuY29uc3QgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbD0oc3ltKT0+e1xuY29uc3QgbmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihuYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiB9XG5pZihuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIGBAQCR7bmFtZX1gO1xuIH1cbnJldHVybiBuYW1lO1xuIH07JGjigI1fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLzskaOKAjV9vbmNlLkF0QXRQcmVmaXhQYXR0ZXJuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sIkF0QXRQcmVmaXhQYXR0ZXJuIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACrS51uAHAADgBwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+Y2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuc2V0UHJvdG90eXBlT2YsXG5jcmVhdGUsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90bz0ocmVtb3RhYmxlLGlmYWNlKT0+e1xubGV0IG9sZFByb3RvPWdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG5pZih0eXBlb2YgcmVtb3RhYmxlPT09J29iamVjdCcpe1xuaWYob2xkUHJvdG89PT1udWxsKXtcbm9sZFByb3RvPW9iamVjdFByb3RvdHlwZTtcbiB9XG5vbGRQcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5GYWlsIGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZSBpZih0eXBlb2YgcmVtb3RhYmxlPT09J2Z1bmN0aW9uJyl7XG5vbGRQcm90byE9PW51bGx8fFxuRmFpbCBgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG5vbGRQcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbmdldFByb3RvdHlwZU9mKG9sZFByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbkZhaWwgYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gfVxucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvbGRQcm90byx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOidyZW1vdGFibGUnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTppZmFjZX19KSk7XG5cblxuIH07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlPShjYW5kaWRhdGUpPT5cblJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZT0nUmVtb3RhYmxlJ10gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmUgZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXRcbiAqIGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXQgb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wcz11bmRlZmluZWRdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxGYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xuYXNzZXJ0LnR5cGVvZihcbnRhZyxcbidzdHJpbmcnLFxuWCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YCk7XG5cbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0CUOi7woAAC8KAAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsUUNMQVNTLGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QsQXRBdFByZWZpeFBhdHRlcm4scGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJBdEF0UHJlZml4UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoQXRBdFByZWZpeFBhdHRlcm4gPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YoXG5xY2xhc3MsXG4nc3RyaW5nJyxcblggYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YCk7XG5cbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihcbnJlc3QsXG4nb2JqZWN0JyxcblggYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGApO1xuXG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuIWlzQXJyYXkocmVzdCl8fEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4hKFFDTEFTUyBpbiByZXN0KXx8XG5GYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWApO1xuXG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG5hc3NlcnQudHlwZW9mKFxubWVzc2FnZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWApO1xuXG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xuY29uc3Qgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5pbmRleD1OdW1iZXIoTmF0KGluZGV4KSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1lbHNle1xuaWZhY2U9cXVvdGUoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4vKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuY29uc3QgbmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaOKAjV9vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMteTRcMGAADDBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsPShzbG90LF9pZmFjZSk9PlxuRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjigI1fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwcyxoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU2VyaWFsaXplPFNsb3Q+fSBTZXJpYWxpemUgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlVuc2VyaWFsaXplPFNsb3Q+fSBVbnNlcmlhbGl6ZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1NlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3Qgc2VyaWFsaXplPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBFcnJvckhlbHBlci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9PntcbnJldHVybihzdHJpbmdFbmNvZGluZyxfZGVjb2RlUmVjdXIpPT57XG5hc3NlcnQoc3RyaW5nRW5jb2Rpbmcuc3RhcnRzV2l0aChwcmVmaXgpKTtcbi8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuY29uc3QgaT1zdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG5jb25zdCBpbmRleD1OdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSxpPDA/dW5kZWZpbmVkOmkpKTtcbi8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuY29uc3QgaWZhY2U9aTwwP3VuZGVmaW5lZDpzdHJpbmdFbmNvZGluZy5zbGljZShpKzEpO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oe2lmYWNlLGluZGV4fSk7XG4gfTtcbiB9O1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbmNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX09ZW5jb2Rpbmc7XG4haGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwnbWVzc2FnZScpfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHttZXNzYWdlLC4uLnJlc3RFcnJEYXRhfSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VW5zZXJpYWxpemU8U2xvdD59XG4gKi9cbmNvbnN0IHVuc2VyaWFsaXplPShkYXRhKT0+e1xuY29uc3R7Ym9keSxzbG90c309ZGF0YTtcbnR5cGVvZiBib2R5PT09J3N0cmluZyd8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuaXNBcnJheShkYXRhLnNsb3RzKXx8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuY29uc3R7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc309bWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xubGV0IHJlc3VsdDtcbi8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG5pZihib2R5LnN0YXJ0c1dpdGgoJyMnKSl7XG5jb25zdCBzbWFsbGNhcHNCb2R5PWJvZHkuc2xpY2UoMSk7XG5jb25zdCBlbmNvZGluZz1oYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiB9ZWxzZXtcbmNvbnN0IHJhd1RyZWU9aGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gfVxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4vKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbi8qIHRvIHNtYWxsY2Fwcy4qL1xuYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG5zZXJpYWxpemUsXG51bnNlcmlhbGl6ZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABBZ7N5AhwAAAIcAAAnAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9jb3B5QXJyYXkuanMiLCIuL2hlbHBlcnMvY29weVJlY29yZC5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vaGVscGVycy90YWdnZWQuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9oZWxwZXJzL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZU9mfSBQYXNzU3R5bGVPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJpbWl0aXZlU3R5bGV9IFByaW1pdGl2ZVN0eWxlICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVufT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgcGFzc1N0eWxlT2Y9bWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACCOdmTAw0AAAMNAAAmAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEByZXR1cm5zIHthcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycmF5KT0+cGFzc1N0eWxlT2YoYXJyYXkpPT09J2NvcHlBcnJheSc7JGjigI1fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5jb25zdCBpc1JlY29yZD0ocmVjb3JkKT0+cGFzc1N0eWxlT2YocmVjb3JkKT09PSdjb3B5UmVjb3JkJzskaOKAjV9vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSByZW1vdGFibGUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7cmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuY29uc3QgaXNSZW1vdGFibGU9KHJlbW90YWJsZSk9PnBhc3NTdHlsZU9mKHJlbW90YWJsZSk9PT0ncmVtb3RhYmxlJzskaOKAjV9vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEFycmF5XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRBcnJheX0gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheT0oYXJyYXksb3B0TmFtZU9mQXJyYXk9J0FsbGVnZWQgYXJyYXknKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKGFycmF5KTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyYXl9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlY29yZFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgcmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlY29yZH0gKi9cbmNvbnN0IGFzc2VydFJlY29yZD0ocmVjb3JkLG9wdE5hbWVPZlJlY29yZD0nQWxsZWdlZCByZWNvcmQnKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlY29yZCk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVtb3RhYmxlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVtb3RhYmxlfSAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlPShcbnJlbW90YWJsZSxcbm9wdE5hbWVPZlJlbW90YWJsZT0nQWxsZWdlZCByZW1vdGFibGUnKT0+XG57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbnBhc3NTdHlsZT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7Vw73HwEAAB8BAAAhAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP8KKk+6CwAAugsAAB4AAABAZW5kby9uYXQtdjQuMS4yMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJpc05hdFwifSk7JGjigI1fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwgJ25hbWUnLCB7dmFsdWU6IFwiTmF0XCJ9KTskaOKAjV9vbmNlLk5hdChOYXQpOyAgIC8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuaWYodHlwZW9mIGFsbGVnZWROdW0hPT0nbnVtYmVyJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IG5ldyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhBG/06kSAACpEgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHQMDI9UBwAAVAcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAG8tpOIdqAAAHagAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAAHt2mAaCwAAGgsAACMAAAAAAAAAAAAAAKSBT6gAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzUEsBAh4DCgAAAAAAAAAAAOJvTpk4LwAAOC8AACIAAAAAAAAAAAAAAKSBqrMAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA2RId4A43AAAONwAAJgAAAAAAAAAAAAAApIEi4wAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAAbCinNPIFAADyBQAAJwAAAAAAAAAAAAAApIF0GgEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAAAAAAAAAAAAAKSBqyABAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADaWHrcMxsAADMbAAAlAAAAAAAAAAAAAACkgb0iAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAACku7JGMBQAAjAUAADoAAAAAAAAAAAAAAKSBMz4BAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA5Yi6XJkFAACZBQAAOgAAAAAAAAAAAAAApIEXRAEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABftXjEHAYAABwGAAA2AAAAAAAAAAAAAACkgQhKAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAkYC5rn8HAAB/BwAANgAAAAAAAAAAAAAApIF4UAEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAARUPyuBBAAAgQQAACMAAAAAAAAAAAAAAKSBS1gBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAAKQ7p4ffPAAA3zwAACkAAAAAAAAAAAAAAKSBDV0BAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAALlEVLjuDgAA7g4AACEAAAAAAAAAAAAAAKSBM5oBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAADe2zWl+wUAAPsFAAAtAAAAAAAAAAAAAACkgWCpAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAANpkxtoYmAACGJgAAJgAAAAAAAAAAAAAApIGmrwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAK4Nx++lCAADpQgAAKQAAAAAAAAAAAAAApIFw1gEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAApY/07oUEAACFBAAAMAAAAAAAAAAAAAAApIGgGQIAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy9tYWtlVHJhY2VyLmpzUEsBAh4DCgAAAAAAAAAAALthY22EDQAAhA0AAEMAAAAAAAAAAAAAAKSBcx4CAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdmF1bHRGYWN0b3J5L2xpcXVpZGF0ZU1pbmltdW0uanNQSwECHgMKAAAAAAAAAAAANNnSK2gEAABoBAAAJQAAAAAAAAAAAAAApIFYLAIAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAACv9CbIfQEAAH0BAAAkAAAAAAAAAAAAAACkgQMxAgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAAraa1iY0AAAmNAAAJAAAAAAAAAAAAAAApIHCMgIAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAFLz3TiICwAAiAsAACIAAAAAAAAAAAAAAKSBKmcCAEBhZ29yaWMvbmF0LXY0LjEuMC9kaXN0L25hdC5lc20uanNQSwECHgMKAAAAAAAAAAAAd0s+I6MdAACjHQAAMwAAAAAAAAAAAAAApIHycgIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzUEsBAh4DCgAAAAAAAAAAAB2uWDLqCQAA6gkAACQAAAAAAAAAAAAAAKSB5pACAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA5r0d4QCoAAEAqAAAnAAAAAAAAAAAAAACkgRKbAgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAFJLQJIsXAACLFwAAKgAAAAAAAAAAAAAApIGXxQIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3B1Ymxpc2gta2l0LmpzUEsBAh4DCgAAAAAAAAAAAPJbLelGHgAARh4AACcAAAAAAAAAAAAAAKSBat0CAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAADRvEy5OQwAADkMAAApAAAAAAAAAAAAAACkgfX7AgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAABt5t8zpSEAAKUhAAAsAAAAAAAAAAAAAACkgXUIAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAADW1iozlQEAAJUBAAAgAAAAAAAAAAAAAACkgWQqAwBAYWdvcmljL3N0b3JlLXYwLjguMy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAAAEGauoGCIAABgiAAAhAAAAAAAAAAAAAACkgTcsAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAIQT5lIJDAACCQwAAKQAAAAAAAAAAAAAApIGOTgMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY2hlY2tLZXkuanNQSwECHgMKAAAAAAAAAAAANGh3LcoaAADKGgAALAAAAAAAAAAAAAAApIFXkgMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAATIvipA4TAAAOEwAAKAAAAAAAAAAAAAAApIFrrQMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAACOhI2Thw8AAIcPAAAoAAAAAAAAAAAAAACkgb/AAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5U2V0LmpzUEsBAh4DCgAAAAAAAAAAAEt1eTgaIgAAGiIAADQAAAAAAAAAAAAAAKSBjNADAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAlMrdq60lAACtJQAANAAAAAAAAAAAAAAApIH48gMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAADCCfN5CQsAAAkLAAAsAAAAAAAAAAAAAACkgfcYBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAABay5YGrQYAAK0GAAAwAAAAAAAAAAAAAACkgUokBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAAoPyAKtJAAADSQAAAMwAAAAAAAAAAAAAApIFFKwQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAJGkyYE6LgAAOi4AADQAAAAAAAAAAAAAAKSBaGwEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAonVHfLUHAAC1BwAAMwAAAAAAAAAAAAAApIH0mgQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzUEsBAh4DCgAAAAAAAAAAABoEOvTNyAAAzcgAADQAAAAAAAAAAAAAAKSB+qIEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAAcylTTvA8AADwPAAALgAAAAAAAAAAAAAApIEZbAUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAAA4EE4s9RUAAPUVAAAxAAAAAAAAAAAAAACkgVWpBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAADZ/Mb5rDwAAaw8AADEAAAAAAAAAAAAAAKSBmb8FAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAKJflbqYRAACmEQAANQAAAAAAAAAAAAAApIFTzwUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAACUiAFmcNAABnDQAANQAAAAAAAAAAAAAApIFM4QUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAKlCtyDwTAAA8EwAALgAAAAAAAAAAAAAApIEG7wUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAA/IEqgRHUAAER1AAAhAAAAAAAAAAAAAACkgY4CBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAFueZRq4iAACuIgAALgAAAAAAAAAAAAAApIEReAYAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2Zhci1jbGFzcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAACPyzk/PQYAAD0GAAAkAAAAAAAAAAAAAACkgQubBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAI8gotDQJAAA0CQAAKQAAAAAAAAAAAAAApIGKoQYAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2tpbmQtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAArcdmbcocAADKHAAAMAAAAAAAAAAAAAAApIEFqwYAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzUEsBAh4DCgAAAAAAAAAAAO2gUu6nEAAApxAAADQAAAAAAAAAAAAAAKSBHcgGAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNQSwECHgMKAAAAAAAAAAAA0p7ugOAbAADgGwAAOAAAAAAAAAAAAAAApIEW2QYAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanNQSwECHgMKAAAAAAAAAAAANEO3fusRAADrEQAAMAAAAAAAAAAAAAAApIFM9QYAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAIOhdNVVJQAAVSUAADkAAAAAAAAAAAAAAKSBhQcHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qc1BLAQIeAwoAAAAAAAAAAADkXS0KrAgAAKwIAAA1AAAAAAAAAAAAAACkgTEtBwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc1BLAQIeAwoAAAAAAAAAAACFbRi1FDYAABQ2AAAwAAAAAAAAAAAAAACkgTA2BwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanNQSwECHgMKAAAAAAAAAAAA1rdNO8EFAADBBQAAMwAAAAAAAAAAAAAApIGSbAcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAANlY69+FBAAAhQQAADcAAAAAAAAAAAAAAKSBpHIHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanNQSwECHgMKAAAAAAAAAAAAQIps918FAABfBQAANQAAAAAAAAAAAAAApIF+dwcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanNQSwECHgMKAAAAAAAAAAAAyu4vCaYLAACmCwAAMAAAAAAAAAAAAAAApIEwfQcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAANwmhyfuOgAA7joAADUAAAAAAAAAAAAAAKSBJIkHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPoP7V/rEQAA6xEAACQAAAAAAAAAAAAAAKSBZcQHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAACi1JzLCgIAAAoCAAAqAAAAAAAAAAAAAACkgZLWBwBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAA4rOx3dgPAADYDwAALgAAAAAAAAAAAAAApIHk2AcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAAAAAAAAAAACkgQjpBwBAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAAAAAAAAAAACkgQL6BwBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAADDAhnAKQAAACkAAACsAAAAAAAAAAAAAAKSBjQYIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAwBoMIXk9AAB5PQAALQAAAAAAAAAAAAAApIHgRggAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAAAAAAAAAAAAAKSBpIQIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAAAAAAAAAAACkgdeLCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAAAAAAAAAAAAAKSB9pMIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANExutlGCAAARggAADAAAAAAAAAAAAAAAKSBnaUIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAAAAAAAAAAACkgTGuCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAE8mw+9h8AAPYfAAAtAAAAAAAAAAAAAACkgXjICABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAFMaqwYoPAACKDwAAMAAAAAAAAAAAAAAApIG56AgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAAAAAAAAAAAAAKSBkfgIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAKtLnW4AcAAOAHAAAqAAAAAAAAAAAAAACkgZILCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAAAAAAAAAAAApIG6EwkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAAAAAAAAAAAAAKSB8CwJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAANAlDou8KAAAvCgAACoAAAAAAAAAAAAAAKSBXTEJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAy15NFwwYAAMMGAAAtAAAAAAAAAAAAAACkgWFaCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAAAAAAAAAAAApIFvYQkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAAAAAAAAAAAApIEFlAkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAAAAAAAAAAAAAKSBTLAJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAAAAAAAAAAAAAKSBk70JAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAAAAAAAAAAACkgfG+CQBAZW5kby9uYXQtdjQuMS4yMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAAAAAAAAAAAApIHnygkAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAAAAAAAAAAACkgYLUCQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAAAAAAAAAAAAAKSBldcJAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAAAAAAAAAAACkgYbqCQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAAAAAAAAAAACkgS3yCQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc1BLBQYAAAAAYABgAJ0hAACQ8wkAAAA=","endoZipBase64Sha512":"9e353b583542ea11e3e606fee56805e5bb60101d9579b654dd48732d9a82ae67ccf579fb8cd65eda5cac1f022087ad81d5314b2629b0e12fe8c4ce6ad5929e98"};