@agoric/builders 0.3.0-u23.0 → 0.3.0-u23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/package.json +17 -17
- package/scripts/bundles/bundle-binaryVoteCounter-js-meta.json +0 -790
- package/scripts/bundles/bundle-binaryVoteCounter.js +0 -1
- package/scripts/bundles/bundle-committee-js-meta.json +0 -810
- package/scripts/bundles/bundle-committee.js +0 -1
- package/scripts/bundles/bundle-contractGovernor-js-meta.json +0 -805
- package/scripts/bundles/bundle-contractGovernor.js +0 -1
- package/scripts/bundles/bundle-econCommitteeCharter-js-meta.json +0 -765
- package/scripts/bundles/bundle-econCommitteeCharter.js +0 -1
- package/scripts/bundles/bundle-feeDistributor-js-meta.json +0 -770
- package/scripts/bundles/bundle-feeDistributor.js +0 -1
- package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +0 -960
- package/scripts/bundles/bundle-fluxAggregatorKit.js +0 -1
- package/scripts/bundles/bundle-mintHolder-js-meta.json +0 -740
- package/scripts/bundles/bundle-mintHolder.js +0 -1
- package/scripts/bundles/bundle-priceAggregator-js-meta.json +0 -990
- package/scripts/bundles/bundle-priceAggregator.js +0 -1
- package/scripts/bundles/bundle-provisionPool-js-meta.json +0 -915
- package/scripts/bundles/bundle-provisionPool.js +0 -1
- package/scripts/bundles/bundle-psm-js-meta.json +0 -980
- package/scripts/bundles/bundle-psm.js +0 -1
- package/scripts/bundles/bundle-reserve-js-meta.json +0 -975
- package/scripts/bundles/bundle-reserve.js +0 -1
- package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -880
- package/scripts/bundles/bundle-scaledPriceAuthority.js +0 -1
- package/scripts/bundles/bundle-vaultFactory-js-meta.json +0 -1045
- package/scripts/bundles/bundle-vaultFactory.js +0 -1
- package/scripts/bundles/bundle-walletFactory-js-meta.json +0 -990
- package/scripts/bundles/bundle-walletFactory.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABZrWc60PIAANDyAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgIm1vZHVsZSI6ICIuL3NyYy9jb21taXR0ZWUuanMiCiAgfSwKICAiY29tcGFydG1lbnRzIjogewogICAgIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9iYXNlLXpvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImhlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMmZjOTZhZTJmZTA4NjZlNjdkN2EyODZiNTIzNDMxOTU4ZWRkYTY2ZTYwMGIyYmM0YzQ1Y2ZjMWQyYzYyMWY2NDQwM2ZhMDJhYjU1YWY2NzcwODdmMjI2MGQyYjRlNmQ2NWQzNjZmOTg3OGFkZTU5NjdlOWUwOWE1ZjY2MjhkYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyZjZhODY4NjRjYjUxN2Y5ZWU1ZTBlOTczNWUzZGIxOGM3MmFiNTEyNTg0OGZiOGZiNWZiYjI3NDZkMmFhMjQ1MjNhZGRhMjkyNGNhY2UxNWU3NmViMzEyOWYyMDc1NjFlYWE0YjhmODFiMDhhODI5OTFmNWM5MzFjMDk0Mjk4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1YmE3OTE1M2RiODgzZGVhMDgwOGE5MDYzNmQ3MTZkZjAzNGE3MDZiN2Y4NWRhZDM3NzczMjg1MDlhYzZmZGY5ZTk1NGFjZjk5OTk5MzA5NTc0ZjEzYzNmN2FjYzk2MTAzOWI5NDQ5YjgzNTg0M2RkOWQ5OTQ1NTNhZDc3MDIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODE4MzdlNGFhNWUxMmYyYmZlOTJhYzIyZmNkN2ZjYmNiY2JhNDk0YzJjMzBjNTI1NTYyOWM3ODM2MDQzMDFmZGNmN2FhYTdlMmFlOWE2NWFhOTgxMmY5Y2M0ZWRkMjQ0OTRiM2JmNDJmMDU1NjdiY2ZjNzM5Y2JlMWU2YTMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNDFjZDYxZTQzOWE0YTczNzFkZTNlM2UxZmMzZjFhMmJmNDM4YWQ5MDFhYzJjYmQ0YzFjZTBiYmUyZjFiNDJlMmVkNDdlYjBmMWI1OGQyNWUzMjYxZmU1ZGE2OWE2NjI2NjA5MGMwOTE4ZjdjNDE5YzBmMDQ2OGYyNWRkMDRjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLW9uY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2Utb25jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmZTIxNDMyYmFiZjlhMzg1MjNiZmNjMjczZDlhNGFhNzUzNTI0MzJkOTBmMzdlOGIyYTY0YWJlM2UwYmYwOGJiODNkZGMyOTRkNmM5NTY3MDMxOGQ1NTQwNTNlYTQ4ZTY0N2U5NjllYThjMzAxZTY0MjQzNzdkZDIzNDkzNTdkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dhdGNoLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhdGNoLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNGQ4OThlODU3ZWU5ZDhmNjcwZTcyZGM5MGM4NmRhYTZhNGQ5NWIwMDFjMjEwNzlmN2UwNDY5MDYwNGNiOWJmNjllNmIyN2MxNGRmN2M2ZDQ4MjhlN2ExODQ4YmQ5M2MyMDVjNjI2OGJjNWQ3ZDNiNzI2Y2Q4ZjJkODM4MDZkOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZXJ0cCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kdXJhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MjFmOGNhNWEyZGJkNGFlNTZlYTA5NzEzYjM3ZDlhNTE1MzY3MmY4OGQxYjFhYjk5MTRjYTJiOTkyOGE0NDdjYWQ2YTJjZGU0OTI1MTJhYjVlOGIwMWNmODRhOTA5N2Y3NTdhNmY1ZmJjYjU1YjUzNjgwZDU5NWZhMGZjOTZlNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZjU5OTUxOTMzYzU2MmRlZGRiMzk1NDg5ZTU3OTkyNjNlNjAwNTRiNGE3NmE1Yjg2OWM2NDUyMTg4YTA0OWZhMTM4ODdiZmE4MzY4MjY2OWMzNDJjNGFiZjcyMWI2YzhkNGY3ZmMwZmYxNWNmNzE4NzhhOTZjZDJkOTc0NGU4YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxOGM1NjFlMjk0NmEyNzJhNjlhM2FmMDYzZjI1OTUzMjgwODAyYzdiNDE0MGRiNmMzZjE5ZjhmMmVlMzNhOWMyNWRjMDgxYmEwM2U5MjAzYTE4MDlkNzZhZWI3MzYzMTNkN2MzZmExOGJkYzgxZDBhMmVlMGQ1Y2ZkZGIyOTRjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYWU0NjFlMDZhYTc5NDEwZWFhNzBlMTY1YzM1NDE2N2VkYWU3NTM0YmU5MjcwYWM0NTZmZDc5MjcwYmY3ZDhjYjIwNjE0MDEyYzUyODMzNTJjODI0MmRhMTdlYzVhYTc3ZmUwMmVkZDc3ZjlmOWIxNTkxOTUxOWRhY2ZkNDlhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFkNjg5ZTFmZWY0Yjk1MzBmMzJiOWI5MTFjMTVlZmMxNjU2ZjQ0YWEwZDQ1YjEyYTFkMjRkODA5ZTcwM2EzY2U0MWEwMjViNjNiODlmM2I3ZjRlOWNhZjc1ZDM4YTdlYzYzZmQ1OTg1MzBiZGU1MWM2ZjY0YzU2YzViYzU3MTAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGI1ZGQ1NjUxZjk0MmVmZmEwYTZmYzk2YjRkNzQzNzM4NThjMDBjMzNkYzE2Y2U1MzMzNGQzMjA2ZDNlOTkxNWUzNTJjMGY2ZDdhNDhlOWE3NjQ3Y2E4ZTA3ODA3M2E1ZDdkZmM1ZjM2NTk4MjhiMWI0MDE1YzJlZTM4NmI1YmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZGVlZjliMDA1NzlmMWFhNmJjNmJiOTBhNmEzZTYyOWVmNzlhN2RiODA1Y2M1MTJhZDlkNWFlYjA1NjA3OGJjZTBlNDVjZWRlYTIxYWIwYmU3OGIwZTYwYzAxYmY1MTAzZDRmOWIxMTEwNmI3NWVkZmQxODFlMzIyOGVhYzE3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNjI0NzY0MzNhNTQ3YjdkNjljMTlhYjBkMDEyMDg1ODFkODhmZGI1ZGEyNjE5OTAxZTYxM2IxNTdiYjI0MDVmOWZlZTlkZWFmOTFiN2FjZGIxODZkNDI2ODE3NDM1NzM0NjBlMGVjNjRiYzE0OWY3MjRjZDczZTQ2ZThlMGNiNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Njg3ZmQzOTFmMzU3ODUxN2E4YWFhMzIyYmM1ODQ0YjYwZTVhZDljZTEzMTExYmYwNjliYWVhMTYwMWY4ODg2OWNmNzkyZDhiNzBlM2ZlMTY1ZWRlMTFhNzllZTVlNDQ2ZGE2YjlkYzFiMWM0YTIwNTU4YzRlN2VhNTRlNTQzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYzMTIwOWRlMzg2ZWJlMzNmNGUwNmE4YzhiMWI5ZjIzZjBlNGVmODUwOGY0ZGFlMjRmMDlmYjE5MTE2MDYzODQ1NmM4NWI0YTU5ZWU3MjNhZjg3MjJjNzllZjlkYzYyZjk1OGQ3ZTg1M2IwNThjNmI2NDQ0MWNiZmZhZjI2NDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhNWIxMjQxY2EwNTQ1NjAwYmU3NGEwMjAxZjk4NzMyMjY2NWYzNWUwNmY3YmFkZGMyMjBjZGNhNDc5NDNjNmMwZmNlYzFhNjI5YWQxNjljNjI1NGExODFjYTcyNmMzMDBhODlhMDVlNGM4NjA3MGZmZjBlZGU3ZDc2M2JhNjcyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNlZjU3ODc5NDE1ZDc4Yjg4MzM2MGZlOTFiZGI3NDUxMWEyNzM0MWI0OGMzOWZmYmY5NjFiMWU3ODY3OTQyZTQ1Y2E1ODkxOTQ0NWI1OGIwNzBjZjRlYTdlYzMzZWEwMzQ1Y2EwZWU5MTUxNDJjMjg4YzkwNjFjNDNmNDIxNTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYwZjY0YWQzZGQ2OGIzYWQ0YWFmNzFiZWI5MDVhYTcxOTYzNjBjNzQ1OTViNmRmNGI2NGU5N2YxYTg5MTg3OTNiZGI2MjhlZjM3NmFlZWRhMjkxZWIxMjgwODg4YjgyNzhiNDAxYzZhZTE4NmJjMGVkNjU3OTJmMjZjYjQzNjU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNDA0N2Y1ODMyNDcwMWE5YjIyMmM3OTg4Yjg3NDcwMDRiMTdlOGMyNjVhNjdmZWM1NDBhYWY1NThmMTA1MzE0NDkxYTMzMzM0Mzk4N2Y1OTQ2MDMzNTgwYjUyMDFlMmRjYTA2NzViZjU3OWIwNzAzOGJmZmZiNzJhZmY2NzAyYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZ292ZXJuYW5jZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21ha2VIYW5kbGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tbWl0dGVlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21taXR0ZWUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZjgyZDlkYjkyODI3MTBjMGJiYTc5ZDEzOWU0NDNhOWViOWE5NjM0ZDY4MzRlNWE5MWU2MWVkNjkzNDZmMGNiNWM4YjgwNWZlNDMxNzQ0MGEwMTFhMGVjZmQ4ZWZiMjI5ODBlZTkxN2EyNDU2NDE1YTM3YzZmNDU3MzBiMmJkZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbGVjdG9yYXRlVG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VsZWN0b3JhdGVUb29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3NWQ3M2Q0NjAwMWQxMTM2MDgyZDBmMmRiMDEyYWY4OWMyYzEwZjY4NzE3YjBhMzI3YjlhYjNlNTBmOTg0MmRmM2NmMGM5ODE0NGJjMWRhNjI5MDM4YmQzOWM3NDRmZTA0ZTk3ZmZmODY4NGQ4YzAyZThiNDM4MDE1NDBiODczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3F1ZXN0aW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9xdWVzdGlvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJkZDBhMThjODBjZjY1MTY3Njg3YTlkM2Y1NWQ1OGE5ZmRlNjAzZWQyMjAyMzE2NTAzM2E5MTM2NzZjMTEyYTBhMjdjOTc1ODgxMmNmNGZiMDFjZDMzZDMzY2M3OTJmYjUwNjI3OGJkMDVmNzU4MDA4ZmE2Y2M4Y2JkZDJlNWI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTNjODhiNjUxNzE1N2ExNGE3YTQ3YzJmYWYwM2U3YmUxZTJlZGE4M2EwZWNmMjI0OTM1ZWIzNjFmNDc2NWU0MTVkYmQ4Njg1NTg2NmNlZGNkMzZmYTA0NjI5MzA5MmM2MTBjZDg0ZDgzMDc1OTk4NDYzOWM4ZTI2ZTc3ZThjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92b3RlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdm90ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMWIyM2YxNWMxYTUyNzUyOGI3MWUwZWFkNmRkMzU0ODdmOWVhODkyNmE3NWI4MGViZWYxNjljZDBjYzkyNjNkNTk1NmVkMzBhNDY1ZjhjOGNkNTQyOWQ3ZWYzMGY3MmMxYjcxYzEyYjYzMWNhNmIzYmZkMmE2MzA1MzRjOThiMiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FjaGUtbWFwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhY2hlLW1hcC12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tZXRhLW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWxsYmFjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FsbGJhY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMGVkMjZkMzg2YzRlNjZjYjZlM2I5MDcxNWM5N2FlNmQwZGE2ZWMzMzJmMzY4NDg5ZTYzNTBiNjkzNzdjMGJkYTYwZTAxMGM2NDFjMWRmNzhiYmYxZmFlOGRiYzFlMzkyZGE3MzJmYmEzYzNhN2IzNmY4YjVkNjEyNjNjZTcxMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jbGktdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NsaS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMjI4MWRmYjJjODQxNGY1MTY4OGEzZGZkOTYxYzYyN2U4OTdjOWQ3ZWYwNDVjYzZkM2NlNDU3MTBiZDA3MWNiOGU1NmVkNWNkOWMwM2NiODA3NzY0OWU5NTM3NDk5ZWJjODlkZGY1NjdmMTY0NDU0ZWM2ZWY0ZTFmZjAzMDVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjBiMTBiN2E1YWYyNDFhYTBhZTJkNmNjOTFiMGNhMGZkMWQyYmU1ZjNlYjZmNGJjY2E0Njk2ZmI5NDllYTAwZTAzOWNjMzAwMDEzYTY0NTVkY2Q1ODUyYTExNzBmNTJmMzgyMDc2MTdkYmIxMzJmNzQzODg0MGY5N2Y4ZjVlMWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVidWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlYnVnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTJkZjM0ODE5YmViOGZmNzIyYzc4YWYxYjc5MWVmODA5MWU1ODMwODlhYWI3NDZhZjQ5ZmVkYTgwNGQ4ZGM2ZTJlZTIwZDU4YzI2YWYyNjI2NzE0Y2RjMmVjNTMxMGE2NDEwODdjNjI4NTI5MDliNTNhZTQ5YjEwY2QxNGY1NTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNDIyNGI1OWY4ZDY1ZTdhZDIzMzUzMDM2ODRiMWE4MWY1MzBhZDc1MzhiNTEzZDNiMDRhMTVmOGRkZmRkMzYxYTk3N2E1N2RlOGIyNzE2OWUyZTcyNDk5NTc5Njg3YzI4MmQ1M2EzMWU3YTNlODU1M2EzNmQxZGQ1MGQyYTRjNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmFkNDdjNjYzMjVhNmM1MDAyOTgwMTEyODlmMjMyMTcyNWM2ZjY2YzRmZWZlNzljNjg2Zjg1ZjdjYjY1NjMyYzI1MjQ0NWE0MjFkYzU5Y2FmNTI3MjRhZDJiMTc0OTUxY2NkMWVlY2M3NzBlM2U2YmFjNjlmZjE5ZjQyZTE1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvanMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Y2EyNTQwMGNlNzJjYTgxMDkwNDljMzhjZDk3NGE4MjgyNDAwMTg3OTA3NzgyNmRhZGQyZGRjNmVhMzRlNmEwNWQ2Nzg3OGVmZWFiNGZkY2I0NzY2Mjg3NTZmNGIyOThkZWQ4MGI4YTQ5ODNkNTY1MjA4YWM4NDA1NjU1ZjQ5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlNaXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleU1pcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc3MmNkZWY4MjMwNGNhNGVhNjQwNmZmMzRiYTFlNzNmYTc0NzI3MDA5ZmJiMGQwN2YwMzBkMWQ2ZWM3ZGMzNzI2ODU3MGIxNTc3YmJlNWNjZGI4YjhkNzgwYzc2NmMyYTViMGViZDY3ODkzOGYwNTJmMzM1NmQ2YTE3ZDE3ZWEzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZjIyMGExYzlkOGJiOTAyOTQ2ZDI5NGQzYmM3OGYxY2FmZWE2ZTc3Zjc5Y2MwNjcwMzc5MzgxZTE4OTZiNGQxNjA3MDljNWRjMGUyOGM2OWViN2ZiZGNjZTg2ZDIwZDg3ZjQyM2E3NDI3ODhjN2Y0YTViMTAyNzc0YzMwMzU3NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY3MGQ2OGRhNmJmNzY5YmY5MGE4NDI0YjgyNGNhOGYxYzFhYTFmNDYwNDBmNjQ1NmJkNDc1ODE2ODI3MzZiNDU5NmIxNWJmODYzMTIwYmY4MjhhYzk3YWY5YTFhM2ZmNTc5YjcxZjBlYTlkNDFhZmM3MTE2ZTFjMmVjYjlhNDgyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL3B1cmUtZGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE0MGEzOWZlZTJmZGZkNmJlMjU5NzMzOTlhYmM2NjlmNmMxOTBlNzY3ZGIxN2I2NDMxZmJjY2Q3MzdjZGFjOTJlZmFmOWJlMDQ2NDYzNzY2MzQxM2UxNjMzYWJhYjRhMjUzZTk2Y2ZhNTg4MjBiY2E3ZTg1ZDUxY2RlZmVjOGViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVlNWYwM2YzNWYyOWRlOGFlMjNmOWNhZTMzMmFmMjg5ZTY3ODQzZDRjYzljMzMxNjNjMzgzM2FmMTNjMWI3N2Y1NGNiZTVmNGY2YTBmMzMyODc3YjIwYzcxMzBmODNkNGFlZmI2ZjFmMGEwYzQ5NTQwZDJiOTM5YWY1NDBjMDBjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQyZmM2MjRkODk4MDU2ZmQ2YTQ1NmZiYTYwZjA0M2FhZGRlOTRhMGZjOTM2ZWQ3ZmFjNzZjYTdhYWJlMDZjNjY4MGQ5ODBjNzU0MTZlYjlkNzQwOGQzYTIwYWE0YzczZDE3ZjQwMjZiOGE2YzI3YWQ5OWQ0NzU5NGI1NzIyZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0cmljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0cmljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmM2FhYWVhNzM1MmY0YjIzZTI2ZDEyMDk4Y2Y1M2Y3YmUwNWU5NzMxYTkzOTY0Mzg2YzU5NmUyMmMwMmFiYzU5OGVkMWQ0MmU0NDFjNjRiYjFkMTA3ZjlkNDA1OTY5YWI1YTViYjZjOGRmMDU0ODIwNmIxNDRkNTIyMjViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25hdHVyYWwtc29ydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbmF0dXJhbC1zb3J0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IxNGUxMzBiN2E0NzE1YjgxOTI3NmJiZDVlMzg2OTNiYTMwNzYwODU4ZTY4YzBmMzU4ZmNlOTAyNTljZjY2MTNlZWY5YTg3ODgyNDc4YWM0YTQyYTgzYWQ3NjY0NzVkMWY1NzYwMjQ4MGZjOGVhY2VkMjUzZGU1YjMwNGJiMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2VzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zZXMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGM3OWVkYjJkZDE4N2EzNTFhMjk5M2VmOGE5YTU5ZmZkNTM1YTJkMzZiOTYzZTdmM2ZlZGRiZDBmYmMwOGY5OWRlNzkyMTJhMTdjYjVkYWZhMWIzNmU2YzIyZDBmMmU2NDkwNDJjMTRiNzJhZTc5MGY2ZmE0NWYwZjJkYmNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90bXBEaXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RtcERpci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmNTVjMTVmN2ZhZmQ2ZmFlYzkyZDAzZjM3Y2YyNDYzNzM3Y2U0MWRjOWEwNzNlNjRhODVjMGU5OTk1ZTZmMGIwNGYwZDJkYjIyNzY1NDRkYTE0MGNjM2M2MzU5ODA5OTY0NDdmODgyNDUzNzUzZTFkODBhNmExNjBmYWFmYzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVDaGVjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUNoZWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWYzYmM3ZDI0MDgwMjMzYzUxNzk2YzVkMDk0NzZjMjljZTcyMWM3ZmIyMTYxNWViZTkzMjNiN2JhZDk1YzEwOTMyNDRkYWMyNjA1YjhmMWJkOGJlN2ZlMTAyNTdlZjRiYmZjNzI3ZDM0NDAwYjYyNjVjN2IyNDNkMGJkMDYyMmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiYjRmMjZkNjQzNTFiYTY2YWEzMjc4ZDUwNjA5MDFhYzliYzA2YWJkOWI1MDJhNTZjMmJjZTgzMTU4N2FhYWY5ODlhYmM5MDdkYWMwMzk2ZjU1MDA1Njg1MGI1ZDUwMTMzMjEwNDRjM2U5MTMyMmFhYzRkZTBmYTRkNTNhYzBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91cGdyYWRlLWFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1MjhlZjA0NTVjZTM3NzNiNjUwNzk3NGQ2NGU0MzM0Zjk2MTQ4YzlmMTEzNzQ5M2FjMjk0ZTFmMGM4NGM0OTk0ODYyM2ZhMDczZjY3Y2QyOTI4Njk4YjU3MmM4MzQ1YmQwNDgxZTQzYjZmYTJkZmMwYjRiYzhlMDFhNWE5MmI2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy91cGdyYWRlLWFwaS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMWMwZWRhMGU2YmM0MzIxMDllZTY1MDEyYTY1OGVmOWYxMzU4MmY5MTZmODliM2ZjZWEzNzM2MzMyMGJiNWU5NmFkNDI0ZjgxMmZlNjYwZDQwNWZhYmYwN2EzN2IxM2I2NDEwODBhOWZmMzM0NjliZjA5MDJjNTc4ZDY0MDAxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyN2RlZGE0MWY0ZWZmZDQxZDJjOWNlYmI3ZWY5MTQ3MTZlODAzOTI1MGEzZmM2NGUzMmFmZGE2NWZjZDJlYjE1M2JjMmVmODc0NjVmODkwZDMxYTlmOTQwYzBkNDAwN2RkODg1Njg2ZDVmYzI1YmMwY2NlNzFkMWUyZjcwZWQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhYWNlYjE3YzdiNGJmMDAxMzAyODJlOWFjNDc5NGFiYjVkNTE5NTIyNjczM2I3ODZiNmZkZjYwNTA1NTBkZGExYWVkMjNkNmUxNjMwZTMwMGYzZDg1NzhhYWQ5M2ZhM2Q4NjdmNDkwMDgwYTdlZmViMjQ3ZjI2YThjMzMzMDU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkzMDE4MDRkZmM0YzM1MDY4NjZmODA5MzNmZjNmZmE2ZDc0M2UzY2UwNTJkYmNjMzc5NDdmNjRkYzY3OTRlYzdmNTgzNzJhYTc5NzliNjA5ZDc2NjFiY2FmMjljZDk5YzE2M2NkOWQ1ODNiNDA0ZTI0N2Y1NjViMGUxOGRiMTQ0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzVkYjBkMTU5MzcwNDE4OGJjNjc5ZWQ0ZDUyMTZlZmEyMzg4Yjg3M2FkYWFiZTNlNjM1NGFiMzU1Y2M4NDdmNjQ0NWQ5OGE1ZTA4YTc1NmYzZTk4YzJkMjE0NzM4OTY4M2VkNTExMjQzYmMwMWY4OWE1NWJmNGMwNWJhMWNkZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGIyNzhlNDUxNjkxNDU1Y2NhMWJiYzlhODNiM2QzNzg1YTg0MmJmY2FjYzA1MDM5NzlhMDQ0ZTNkNWM2MWM2ZGMwOWQzYTAxODdmZjk1MTkyYjQwYTQ4NzJmOThjMWE4MWM3NzQ5MzVhZDEyZDM3NGVhZDJmYzk4YWQ5MGFmMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTRhZjE3ZGUwYzAxYmNkZjEzNmFlYjYwNjEyMmY1OGM5ZDYzNGZlZjEzNTdkNmRmOGNkZGNkMDUyN2Y3N2U5NTEwZTdkYjJlN2IxNDhjMjcyYTlhMjE5NmRhZDYwZmJmYjEzOWMzMmUxYmM5MDdkYmJiMjdhN2QzODEzYTA5ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI3OTI2MmI0Yzc5YzcwYzQ4MjhmMTliMDlmNDVmY2FhZGFjNTgxZDZhMWQ1NDA1MGRlZTExMjYyNGI2MDViOTRhNzJmZTY1YjhkMTQ2MWZiMGE1YjdkNzQ1MjhhNTQ5ZjAwN2Q4NDI2YmYzNTkzNzU4ZWMzZjJkYmE0YzE5MmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU4N2QyZTEyNDY5NTRlNWM0MTQ0ZTU4ZGM3NjZlNTYwMDE5YjdjNzEwNGFhMzcyMTQ4MjRhMmQ4Y2FmMDgwN2IwYmVhNDc1OGQ1OGFlYjU3NWZjN2ZmY2FhYjYxODIxYzhlZTYwNTgxMGY2NGU2ZTliYTM2MTExOGE2MjVlZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1OGM3OTZhNjdkNzk0Mjg3OWZkNzJjYmZkODA5YjhlNjAxMjYxZjVlODQyNmQwZDAzMzNjYmQwMzQ5NWFjZmQyZDgxZjk0NmMwOWNkMjcwYjZjNmFhZjlkZWRmOTc5YzRlYjhmMmNiNTQzZDcyNDdkYjliZGIyM2I0MTEyNmIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzAzZDVhODBmNzM5ZDRlYWY2ZjI2ODQ1MDE2YTI0MjBkNjJkMjRkYTc3MjliODA5ZDcwMjRmYjY4ZDE0ODQ0OWU1YjE1ZTc4MDJlODQ2YmU1OTVlNjBjZDk1MTQ3ODMzNjg2NGRhYzZkYjNkMjIyZDcxMzI3MGNiYWE3MGVjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzdlM2IyOTcxOTRhMDA1MTEzYTFhNjNmNTg2YzYzMTdhZTI0NGIwNmQ0OTliNzVkYmYxMzkxYmE4NTYxN2NkZTIyM2U4NzVhYTQ1MTJkZmE0YzJjNGRjNDQxM2UyNWE5Njg3YzBkZDU1MTcxNjdkYTM4NDg0M2ZlMjE0YTU3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMTRjNGVhNDI0ODBiNTBhNDk4MWRjOGM2YjQ4OTIzZDA4OTk1NDg1NWM3M2Y2YTM4YzhhNGQ2M2I1ZGQ1MjlhMjY4ZGQ4MzdkZDBhZTE3NTk5Y2NlYzEwODNmMjAyOWUwODcyMzJiZDMyZDc2ZjcyNzIyOWMyMmI4MTM4M2U0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2VlOTlmZGFkMTVkYWE5NGJkMzE4NTEzMjY5Yjc5MmVhZmFlY2E3MGU2NDQ4NTc5YTI0NmYzYzM1NWQwYmUwMDI1ZmYyOTBkNzZjZDhkZGZkM2MzMWEyNGJmYzM3ZjdlZTVhM2M4OGQ1N2RiYWE1MmYxZjY3NTYwYTMzNDMxMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyNGY0OWYyZjQwNDM0MzRiODM3OTk2ZDQ1NjhhMmE2MDY1M2U2ZTNiMTUxNTVjMGFmODJiMTNkNDIwYjIwNTc5ZTkxY2UwMmUyMmYxNDBhNGQ1MjU5ODQ3YzE5ZTcyOGIzZmYyNGU4YTBkYmQ3N2FjN2M3YmQ0NDE3NjNlYmE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMzBkZThjZTkzOWNlMjAwZDBjMTA2MTQ2ZGJmMTllM2ZjZDhhZWFhMWFlZGQzYjEzZWQwMzk3ODJlOTlmNjdmZTBhYmQyNmZjNDFhYzIzODExMjkxNzI2MzRkOTBhNGY2NTRmZDE4MDU4ZTMzYTdiMjA1N2VkMjAzZTY1YzNkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3Y2ZlZGMyMmNlOTQ4MjhjNGU4ZDkwN2FiN2Q0MGUxODIyYmVlZjg1NTllMzE2YmMwODgzZTA2YmQ4M2FiZTBlMWUyY2Q3NWEyN2EyODA1ODdhMTIxMGUxZDFiMjZiZWQ3NTQ5YTVkMmY1N2QwYTZjYWQ1ZWU5YWQwZDViNmRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3RpbWUtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3RpbWUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDBiYzRiMjFhMjhjM2E1Yjc2ZjQ3ZmFkYTRlYzE3NjFlMTE1OWM0MWUxZmViYmYwOTVlYWVkNjExOGUxNzM2ZTU5NDYwM2MxOGVmMDI0YWM1NmY2YTVhYjNmM2NmMDg2YzVmNWI1NDRlZGUxMDAzMDFmYjM1ODI5YzUxYWIyN2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGltZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RpbWVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDcwNWE0OGE5MzI3NmNiMjMxNmUzYzZiODBmYzFiZDQzOWY2ZmVjNTc2YjUyYTg0NWRjOTg4YjZlMmJlOTRhMWVkZTkyMjZjNmEyMmM2ZmI4ODA4N2FmZDFhMjM1YWM4MGFjYmMyYTE5ZDI5YWU5OTE4MmZkMWQ4Y2ViMDY4Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM2MWIwNjAyNGMyZGQzMmY3Y2UxYzg0YzNmZWMzY2ZiNTdhZjhkMjkyZjIxZTdiOGYyNDAxNTM3MWMxN2YyMzFjMWFlMmQ0ZDE3YTBkMzQ4NjZhMWM2ZjgwNzMyOGNlZmFmMjg5YWFlOWNhYjViYjFhYzBiZTYyNDJiOTNiOTE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2OWJiMTU3MjgyNDk5NmU4Y2M2OTdjZWJhYjU0YTIwYWNjMTljYmVhZDBmYmVhMDUzOGU2NDYxNjMyYmYyOTE3ZGNhNGU3NDM5YWRhNGMyZDhiNjNmMDFlNzkyYmE3NDA1OTc1OTdkYzM3ZTdjMzZhNDJiYTdlNzY0ZTk1NWM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3MmZlM2E2ODM4ODNlODVjYzRkZDNiODZhOGI1ZmMxZjJiYTFmNjc3ZWI4MDMzMTk5MGZkNTQ1MDU2ZjhmMWEzMWJkNGU2OTM1OGViYTEzY2U5MGQxYTJjNWNjMWMzMmZmOTU5MGQyOTBmNGNkODc0NTk4ZTg3ZDAyNzk3MzkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzNDRmMWRhZDhmMmE2NTA1M2Q3YWVlYTBiOTZjZWMwZmZkMDJiOTlhNjFhYzcyMTc1MGJmYmNmY2FjYzRjYmNjZDBjY2RhZWNkODM0ODQzNWMzYWY3MWNlMzg2YzY4MGEzMGMzNDI4Zjc0YmExNWYzMTA5Nzc3NjI2NjQ4YzUzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZUhhbmRsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3YzVkNWZmZDY0NmIwMDEwZGI4Mzk1YTAxZDlhM2RhMjg5M2ZmMDY3ZWFiYWFkZWI0MzZhOWRkZjc1NmE0ODdjM2U3YjFhMDYzODlkOTU3MWQ2ZGIyNWIwZmQwZGYyMzViYWE0MmUxOWZmZWIyZGEwZDhhYzY3YjI4YzNjZjFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTA2MDljN2Y4YzU3ODY2ODM4YWUwYzQyMDVlMzc3ZTczNjEyNzkzYzE1ODJmMmY4NzA0MjFiY2Y3M2EwZWFkMTk3MDY2NGMzZTM0ODFkNmI0MDQ0NjE1ZDc2MDEzODllYjViMzZlNzE5MTYyYzg2MjYxMjA4NjM3MGNlNjJmNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b25lLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyMDhkZWY4ZGYxY2JlMTQxODY2OWRlZGY4MGJkZjU5NTM1OGY1MzY2ZDExODhhYzA0ZmU0YTJjYjljNTNjYTg4NGQ4NTIxNWM5MGYxYjg3Zjk0OWJiMDQ4YTc5NmVlNWI2ZmRhMTNkNTFhMjU5ZTI1NzQ0NjQ4MTlkNjIyY2QzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2R1cmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTMwMTUyZWY0MWUwMzUwMDU0ZDUwNjlhNWY0MzdlMWYyYTE0M2ZiNmY4ZGU2YWNiNDdmMDk0ZDE3OTNiMWQzYzNkYjA3MTAwODg4ZGY3NTU5YjRkYjdjMzdlNzYzZmI5ODhiOTM0ZWUxOGJmMDQyYjZjY2EwMjkzZDI5N2QzNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY2FjaGUtbWFwLXYxLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY2FjaGUtbWFwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NhY2hlLW1hcC12MS4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY2FjaGUtbWFwLXYxLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ5YWVmNGY1ODFlODEwMmY5OGNhNDlhZTQyZWUzYjFiNWFjN2IyMTA1N2QzYjE3ZjA5YmYwODgzZDBjMTViYTEzNWQ0M2NjMzAzMzUzN2Q2Mjc3NTRhYmZlZDEzZTVlOTU2NTYwMTUyYzM4YjU5NTg1NWQ4NzFlNzc0YTExMjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FjaGVtYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhY2hlbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQyMjNlN2IzYTM2ZGYzOWM1Y2VjNzIwYzk0YzM3NGJlZDc1YjQxNTJhMTQwMjZhNjk1Y2VmNmJkYWYzOGRkMjY2MjE1MzdlODA0M2Y4MzRmZjkwNzIxNjgwNWY0ODVjYmVhYmI0MmE4OGUzOTQ0MWRkMTRmZmZmZjBkMzk3MjAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbW1vbi12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImFwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk3NDljZDM3ODU4ODdjZGVlNmZjNmRiODBmZWI5ZmNlZjcxZjUyZGYzNWIzMjc0YTljNzRiYjI4ZWUzNmM4MzBlNWU3OTI0YTEyZTk3M2YzZmE0YjZiMjYwYjVhZDlkNTE0M2RlOGY4M2VlZmIxOWEwYTI4ZTMxM2I3ZDQwYjciCiAgICAgICAgfSwKICAgICAgICAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImZyb20tdW5pcXVlLWVudHJpZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNWYyZTU1NjVjYTQxYzhiMmYxYTBiMjFmNzMzNTcyYmIwZTZmOTc1NTAzZjdjMjZkN2MxODE3NWNhNTk2YjE5YmJiZTI4MTMzNDA3YmI3NjNmODBmNDQ4NWMwNjNhMDI0ZWU1Y2ZkOWUwODE2OWQ3NTYwZGM0ODk5YzY3YWI1ZSIKICAgICAgICB9LAogICAgICAgICIuL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaWRlbnQtY2hlY2tlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM5OTA0MDI4ZjFjNTYxMTZhNDY3MzVjNzU0ZTU2YmYzOTFmNThhMmZhMmQzMGI1MTU3YThkOWM5ZDU4NTE3MjNkNjcxZmJmNTIyN2RjMmNiZjNjMWJiNTc2NDQ3YWNmMGQ0ZDkwOWFlZWIxZjgxYWMyNDkyNzhhNTY2MGZiZjJiIgogICAgICAgIH0sCiAgICAgICAgIi4vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImxpc3QtZGlmZmVyZW5jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM3N2MwZWZhOTlmMjhhYzc3ZjRjMDk0OWM4NDQ4MzliMTZlYWIyMzZjYjkxOWU4ZWE0OGI2NDljNDhkNzkxOGJlZGRjZDBjMmNkOGFhNDAxNzgyNTRjNGM2MDFkYmZlYTE2NzlhZjgxZTI2NjJhNzliNmMxMzA5ODQ2OTY0MmJiIgogICAgICAgIH0sCiAgICAgICAgIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJtYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTU5ZWUzYWU5OTJhYWE4ODhiYmU0MWIzMzAyYjIwNGQxZmRmMzYwMGZjZGU3ZDg2ZTQ0Zjk0YmZhNTM0MTQyMzQ5ODhiMjkyNDlmMjdhNjQ2ODk5YjNlZmE5YzFhYmExY2FiOTQwMzM4OWE2YjlmNDU4OTg5NGFmMjgwNDllOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MDkyZGQ4MThlOGUwY2JjNmVhMWI2YWYwYzIxZGY1YTJlODZlZDE4OTZlMWU3YjcxMmE3OWJkYjEwODRiZTA2OTg5ZGIxYmJiOTg0ZWE5NDQzNTViOTFmYjY2NGU0MWExNjdkMzNhYjUwY2ExZWEwMjgxOGZkOTI0ZjcxNWUzMyIKICAgICAgICB9LAogICAgICAgICIuL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdkZjU5MmNhYzcxYzg1YzMxZWI5NzVjOTIxNzY2ZjBmYzFhYzAyNTExMTI4YzlhZjM1ZjIxNTU4M2Y2OTQ4YTg1OGI3OWI4ZmZlYzMxZDRlOTg4MGEzNWVmOWJhYjdiMmMyZTA2YjEzOGEwNjMyYjExOGY1ODhmMTE4NzIzYzNjIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tZXRhLW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3ODAzZTkwODVmMTZjYTAxYmNhZjU1MDZiNGU1NWI5ZWIxNGY3N2ZkOWEzMDc1OWEyOTg4MjJjYmM0OGYxMjU1OTkzYmE2MWZkZjIxMTNiYTE5OWMxMGMwZjUzNDgzMTgxYzdiN2FhM2VjZjhlMTdiMWYzZjgwYWE1MzA3ZDVlIgogICAgICAgIH0sCiAgICAgICAgIi4vdGhyb3ctbGFiZWxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0aHJvdy1sYWJlbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdhMTA1NThjNjU2YTk4YjVmOWQwMzg0Yzc5Zjk0ZGY5ODIxMTgwZDAwZTljMjY5NzdiMDFmOWFiYjY4YzUxOTZiZGU1MWMzMGYxMjYxNWZkYzk1N2E1MDgwNTc1OTMzZDA5M2IyN2ZlMzk1ZDIwMDEyMGUzNGFiM2Q4OWJkMDIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhY2E3NmVkN2M2YjY1NjcxZjcwYjI2NDZmNjg5NDM1NzI0ZDhiOTkzMGE1ZmYyOWQxZmIzMjdlZDk2ZmQ0MTQ0Njk1MjU4OTYyZGFmYjk4Mjg2MmEyZWZjMWIwM2QwYWQ5NmIzM2MyY2FlNWJlYmZhMzcyNjg4NmEwNmY2NjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW52LW9wdGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vudi1vcHRpb25zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGM4MzEzOTE2N2ZiNTI0NjY4MGNmM2I2MDg5YWU2ZmUyMmNlMmFkODE2ODVjNjNmZGM2M2ViNjljNjUyMjk4MTRhN2Y4YmQ1YmFiYTE2MGMyNjViZGI0NTk1MmEzMTUzOTFkYzUzN2JlMzAzOTU2NWVhN2YwMWM4ODk2ZGRiY2YiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vycm9ycy12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9lcnJvcnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwZDdmZjE3YjNkMjJiNWUzY2Q5MjljYWIyYmZhMWE1MWM3NzEyMzcwMjA1NmZkYzY2NGU3N2ZkNjA4MTUzMzM2MzA2MDcwOTgwN2Q5OTE0YWEwZWQ4Y2E4ZWE4MjQ5ZjAxYzU4MTQ1YTQyZDI3YmRhZjdjM2Q3MTFkOGQzMTgyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDkyNDlhYTcyYWJlMDVhMTIwMTJkOTNmZTUyNWUwZGZmZTQzOWU3NzZlYmNmZWIxOWMyMjFhZGQ2NzliYTJkOGNmZTBjMTUxN2ZlMjdmODMwZTFhZGE5NjkwNWFhNmJhODYxNDBjNWQ5MGIyOWM5ZTU2YjRhMzRkNjJkNDg5ZmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xvY2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sb2NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY4ZjgzMjc1ZmM3NWYxODEwOGZhZTQ4NjA3ZGEwYmQzOWYyNWE4MGQxYzI1OTIzZDM2NjJlNjJkYjRmZmVhMjAwZThiNWFkODU5NzM2YWExZjRhMWJmY2YxMGY1NjE2NzU4MzI1MWY5ZjE4ZjBkOWJlZDE5ZDI3NTJlMDM2YmUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMDJlYzNkY2RjNjE3MzQ5YWY5ZjJlMjVjYWRlMDljOGRlMjhhMmExMGJiMzZhOWYzM2UxYTc4NGU4ZDFiZDc0YWRlOGEwMjI4YzcyYjBlNTUxMGViZGU4YWFmZmU4NzY2ZjdkZTI5NzE4ZDFkNzU4ZTUzZWUxNjAxZWU2ZGYyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNThiMzE1OTA1OTRkOWU3NTY0YzlkNjE1NTRlNTY3MGUzNTAwNWUyYWRmMjBjMTQwNTM1MzQyNGUwMDlkZTE3NDYyMjdlMTJjZmViMDc1OWM4MTgzOTEwY2QyYWMxMGY4MjAxYWUwYmI3ZTBiMzg0OGZlNjcyNzYwYjYzYWRhNGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGQ4MjMxMDk5ZGMzNTUzMDE4NWIzZTYzNjI5NjNjYzllMjI4NWM0NDQ4NzVjOTk3ZDUwN2FhMTMxM2E4NjlmN2U1NWM5NmNlN2Q2MWYxODE4NjFiMTY4YjI2NzE1ZGNhZDg3MDg2MTE3MWUyNjNiOThkM2ZlNTM2NzczODU0MTEiCiAgICAgICAgfSwKICAgICAgICAiLi91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ1dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MDcxMjM4YjI1ZDMwNzY2ZjQ0NzNiMzYwNzVkYjA1MDA0YTMwOTViN2JhNmFkZDA0NGQ5ODY2NWM3ZTBjM2MzMDlkMDRkNDM1OGFhZDhiMDVkZDhmY2YwMGY3ZGYyOTYxNTVjNWY4MjliMmY4YmYzOGRkYmVmYjEwZDU4MzQ5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9leG8tdjEuNS4xMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXhvIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM5NDE0NzNjMzA1YmU1N2U3NzgzMWI4NDZiNWRkNzJmMDViMDNlOTc3MDY5ODQxNzRhY2QxZjNhMTNmZjhjY2E0NmMyZDUxMDBmMzVmY2E3ZDhmMDcxNGE1ZGJkOTNkZDA5YjdlNmRiNmRiNGM2MDg5Mzk5YzI0NGVjNDZjY2I3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by1tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by1tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NDQ3NGY3MWY2N2M3NzgzYzc3YmFlMjYzOWRhOTY0MDFjYWI3ZmJkZjZlNTA2MDcyNjEyNTkwNjcxNjYwOWU3Zjg3MGY5MjFjMjJmYThjMzQ5YmRiZGI0Yjg0MzNkMTg4ZTJlYWY5N2Y5ZWYyMDQyOTA1NDIyYjUwN2FhZDdkZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI5ZWU5YmFjMmZhNjNlODNkNWVlN2I5NmQxY2Y5MDZkOWNhMmYyZjVhODJiY2E4NGZmYzYzNmNiYzA5ODUyZjAyYjJiYjllOGM1ZDkyZTU4NTIyNzIxMzU2YTdmZGNlZDVkY2RlMDQ4MTVkNGYzODI1ZjJhYzNjYjU4MzI0ODk3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2dldC1pbnRlcmZhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNmJhY2NlYmIzYjZjZjRlNTY0YzIwNmEyNWQ5ZjM4NzFjNjVkZTZmNzI3NDY4ZjRlN2QwYjRlMTAxMmRhYTM3NmNhOGU5MzYwNTBjNWEyYmI5ZDQ4YWEyOGFjMTFhZjFjMjBmNzZmY2VhYjQwMTVlMGVmZWYyODI4MTc1MzZlMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYxLjEuMTQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGFiY2U1YjA1ODQ2MDFhYjU1MDY5OTA0MmQxNmU2NmQwNzRjMjU1YjA0MTkzNmQyYjA3ODczMmE2NDkyN2MzNTE1YTNkNGY5NTBlZTk2MDk5ZWEwNGVkMWRjMTZlNGY0YTg4YWViMGQ4MTFiNGVlYjRkOTdhNDkyZGY1MDRkM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjEuOC4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzg4NDMwZmNiNzg2YjU2MWNmMDNlY2Y2NTlkYTg4MGZjOGM0YTZiZTIxZWM2YTI1NmZkODg0M2M5MmJjNjZjMWYxMGY5ODM3MWNjODVjMzY3MGVhN2NjZjc0NDAwYWIxMTJlNGQxMGJjYzM5YjY1Y2UwNWI0ODc1MmEyOGQyY2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDhkNDAwMTMyZTFlMzVjMWE5ZjI2MzAxZDA4ODE4YjJkZDIwYmU2YTg5ZTg3NDkzN2IzYmM5MWQ3NmI5MDg2YTEwM2MzYjdiYmFiMmI1MzI1NzY1YTAxMjg1YmFkMmNkNjIzOWNiMzA5OWQzOTgzN2YzNzQ2Y2ZiN2E1NDkyYTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb0NhcERhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYzhiNDI2OTdkYmVlMDIzMjk5NDI0OWViYjA5ZDJhN2QyOWQzYzg3OWExYTM5YzA2MjhjMDcyMGRkMmFlNWI1OGExNTdmNDYyMTFmOTUzOWYxNmRjMmM2MTI1OWJiYmFjNWYzMDQyMDI2MjJkN2ZhZDc1NzA4ZGIwMDQ5YWY3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNDRhMjk2NTNkZDEyNTI0YmI3ODFlYzZlNzk0ZWQwZjU1NGUyMWI4MWMzZTk3YjM5YjZlYzViMzk5N2RkYWFjMDVhZTVjNzY3N2NiM2JmMzAzNGM4NzZlOTFiMDhlZjIxNjE5ZDU1NWJlMWViZGVlMDMwNmNhZDc0ZGE1NzRkNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkODZhZTlmM2ZmZjllYzA4ZTA0YzEzMjYwYjhhNzM2NzBkOGZjZjU3ZTZiZWU5NzQ0YzYyNzJkMWEwNjA3MDdjZTM0ZmU0ZDVkNDk5MDc2NGVmNGZmMTRjOTkyMzM3NjViNTc3NTY0NDEzOGJjZTEzMjU2MDc4ZWNmYWZjMTczMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMjI4OTFlNGMwNjQzMWI1Nzg0MTBkMzc2YzI5ZWUxNzU2Mzg5ZDllNjcyNTE1OTAyY2ZhYTA3ZmNhZThkYjI0NmY0ZjQ0MGRkZjA1OWI3OWY0ZWI2MmYxYzc1Nzc3ZmRkNWJmYThmY2NkNWFhZjQxODE2NzQyZWRhNzYzY2I3MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzgwY2I1ZjA2N2NlMjJhNzEzMzQwMmQyNzIwYjczZjQxODNhNTc4MWYyMjhkYWMyMGE2YTQzNTQ4ODcyZWVkNWIzYzI0ZTBmYjUzOGUzYWEyZDM4MzkxZmViOGNlZDg0NjA0MGM4NzZhODJmY2M2OGE3NGQzYTc0NTk2YjU3NWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmFua09yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yYW5rT3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNzA1MjllYjQxZWU0ODg0MDEyN2JjMmRkN2FiN2Y4YTIyNDRkZTNmMWZhMzM0ZTRmNThlZWE0MjFjYzMwNWY1NDJmMmU3YTNhMTc3ODZjODdmYzkwNDMwMTdlN2Q3YzYzNzVkYTRlNTE0YzE2NjBiYjgzMDMwMGVlNmQzOGExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbmF0LXY1LjEuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ODcwYjExZTBkOTU4NDY5MTU2ZWIwNzExY2YxYTBhOGE4ZGY0MDc5N2IyMjI1ZjE0YjZiNGFlNzZjOTk4NWMyNzQyMjQwNmIwNzk2MTA5NDIzNDYwMzM5NmIwYjVjYWE4YWJhNzZhOTJjZGU2YmU0MmQ4NWIxODZmODQ3YzAwZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWUyNDRkOTQwOGNlZGI1ZjA4ZDAyYjExZWJjM2Q5MjA1MzQ1MjA2ZGE4YTJlMDhkNmUxYjZhZjUwZWM5OGZhMDRkMDJhN2MwODUxYzllZTA1MmMxZTdmMmRjMDg2ZjQ5ZDU4ZjgwY2ZjYzRiZDk2YTI5MzhkODFkNGQ5MmFjMjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnl0ZUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ieXRlQXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZjdhZGY5NGRkMWIxNjliMDM3MGI5NGFhYzRjYjljODZhNDA4YWNmYTIwNGE2OWVmNjRmMTRjNDZlZDA0MmY4NDgwM2MzOWI0ZDgxNTU3OTEwYzFkNmU5M2QzMDRhMjIxNDk2YmQ3MGVmOGFiODhiM2U3YmQxYzllOTRhNGJlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZjNGYxYzY2Y2NkY2YxMDI1ZDU1ZTI0MWQ1NTk5ZDNhOGE5OGIwMDI2YWIxMmZhY2E1NGEwMTVjNDE4MWZkMzZlMWYyZGVhNjQ4ODliYjZkOTcxYmZmYjJjNTA2Yjc5MDI4MmY1Yjc0ZGVlNmY2YzQyNTA3NmNkYWE1M2ZlYzJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNmI0NjAxMmNiODBmNTFkZjZkNmQ2MjAwMzJlMzU5NzFiZGEzYjk1MTA1MmI4MDJkN2E1NTM3M2JjMGE2NWVkZjgxYzdiMmRkYzM3OTkyN2YxMmVlYmFmMWRjNGM5MGJkNzRlNDE0OTZjNDlmYmUzZTM4ZjQ0OWIzMDEzMGUyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3Mjk3MjRlMTAzZDMxN2ExNjZiNjM4NGVhYmZlMGE0MWRmNzIyZWU4OGUwOGZjYjAyZWExNzNmZDE2NzZjYzdlYzQ1NzczNWU3YmYwMmM5NTI0MGE2NWRjOTViOTEyMWQ1NGEyMDcxZDQ4YWFlYWJiZjRkNDQzYWVhNTFmNThhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRkMjJjYmRmOTlkNDUyMWQyZTE3YmI5ZDVjMWNmZTBkNTllNzU0YjE1ZDFhODU5YThhYjliZTEyZTFjZmMyMzMwMDQ4MzhjZDM2OTllYTQwNzZmNzJlOWYyODRjZDlhYmNkOTY2YjdhZDgyZjA4N2QzY2FjMjhkNmIxMzJmYTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGE1ZGYwNjZkODAyNjY1Y2JjZmM4MTA3MGZjZGFiZmQxM2M3MzA5YWE1NDk0ZTU4ZTVhYzlkMjAzYzYwMWM3ZGU1ZjEwMmE0Y2M2N2EyYzM0MGY3MDBiNmQ0Y2NkYWYwMTlhNGEyY2NjOWNmYTFmZDg3NGQyNTJjOGI0N2ExZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTIyMDBhYzU5MGM2ZGZiMWMxMzJhYjg0NWNkZDQzYTM2MDIwZjA4MmQ3YjFjOWI3NGMxY2IzZjVhYjQ1YWM1YTE0NTVjMDZlOTg0OWEzZmQ0ZTYyMjAxNGEyOTk0MTNjNTc1N2FjMDYyMGE3YmIzOGQzNzlhYzc4NzIyMWQzMTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjZDUyYjA4NGMyMmFhMTk3MWVlMDRmYmVhZDI4NWQ3YWI0M2M4MDZmYTUzZGU5YjJiZGM4ODhlNzU3Njg4NTQ3NDVlNWE3MDE3ZGM0NDQzZjNhYTM4NDc4Y2QzZmIzYzFhZGIzMTlkZDM4MTdmMjEzYjliZTcyNzJjYTAyNzdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNlNWVlMjJmOTUxNzA5NWM5ODZiNDRkZTk3ZTM3N2FlZGU1MWY2YjYyNWQ5OTBjYzg0MWYxMjkwZTU3OTEyZjhjMWExNGJlNGMwYzZhZGJiM2Q5NjYyMGZmZmZlMWEyYTg3NzI4YWY2ZGQ4MDc4ZTRiMzk4OTgwMmU4NTk4NGIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhODI0M2RhZDc1OTRmMzMxM2FjZDMyODM0MGY2NzZjM2NiYjg1OGZmYjViNmZkNDk0NGViN2M0NjI5MmZmNjI1NDY2OWZiZTU3NzUxMzYxMzI3NzM2MWJmNTY4ODlmMDE0NTBkNThhZTI1MjA3ZDM3NjNhOTg4YTg2Y2EwZTJhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjk4YTgyMDJmOTFjNDdmZmE4YWZhODMwMTE2YjgwMWE0YzBiMzJhYmM5ODYxNDI2ZjQzYjlkMmFmOTgzNDIwMzgwMjgxZjdmYWFhNGRmZjNkYzE3MGI5Y2YwNDk5MTE1MzgxOGI0YWQ4YWIwY2Q5MGQ3ZmE0ZjIzZThjYjhhNTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTcwZjIxM2RjMjI1MTFmZjM1ZWE0NDhlNDBkMmExZjI4MTMxODY4MDUwYzMxZWQzNDJmNzY1MmMxOTIxNGFiNzY4NGFmZGFiN2EwMGRhZjQ3MTA5OGUxMjkzZDY2NTFiZTg4NTYyYTBkMWI5NDFlNzg5OGQ5NTM3NThmNzJmZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdHJpbmcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0cmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNhYjkyNjA4ZTUxNGFlMDcyNDdiNDU3YTI4NmI1NTkxY2JhYjQyYWE3YjRhMzA5NjZiY2I1ODc3ODI5NjBlNzM1ODE4NDVmNDY5ODQ0ZGVlNDZkYzcxYmU5OTMxYWQ5YmY1NzM5NzE3MDY1YWMzMjY3Yjk1YmY3ZDMyYmFiNmVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGQyZjFmOGM0ODY3MWQ2OTRhMzkzN2NiNzA1ODcwNmZjOTNiZDY2MTZmYTk2NmNjY2M0NTJhYWMzOTRlOWNlMDIyZmNjNDgwMzRiMzc0NjU5OTc0MjQyOTE5NzAyMWY1ZmE4YWJiNTNlOWMwZjk3ZGFmMjZmOGY4OTBjN2Q4YWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNTgzZGVkMTgwODE1MzlmNDFhODExOTcxNTdjYzA1YWU4ZGMxYmFlOTVjMmE2Nzg3NjhhODJhY2UxMTg5NTQyNzIzMWEzNmU5YjJhYWE3OWFkYmU1ZWQ1OGMzZWM1ODAyNmIyZTdmZjU4NTY2NjA2MTc4ZmI4OTFiZWI1NzVhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IxOGUzYmJkMWY2YTBkMjMwYjA0MjBlZTEyNjZmNjdmMWNiNTNhMWEyNmJjMWYxNDk2NGQ2YWVkNDE5OTk2YTJhY2JlNDQ1ZTA4MmZhYTczNGFmZDg3NjIxOTFlOTI1ZTJkMWQ1ODE1MjQxYzgyOTBlNWJkMTliN2M5ZTdjMjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzliN2FiYTMyNWIzYTk0MDhiYjk3NzNkMmI4MjM0OGUwZWM1YzhhOGVmZGQ0N2ZjY2NlNTFkNGM1MmFiZjJmZDUwMjBmZGFiOWVhZjBkMGQwNTI4Yjc5MTcwYmYwM2ZjMjkwNmMzMjYyY2NkMDJiMTFlZmEzMmVlMjIzN2M3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NoZWNrS2V5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2JiYTNhZDM1MmJjNWQ0MzlmMDdmMjk4YTRiOWE5MjZmMWQwYmM1MzM3YWFiODhlODYwOWQ1YzQ2NTE2MjUxNjVlMTQ3YjQ3OTdiMTE3NTRiOWFlMTA0MmI2YmUwODk3YzE3OGE5ZDZmYjNkZmExMzdhODk2YjliM2I4MjM1YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3OThhMDcwNDlkZTllODcxNjJiYTUzMmIyMzAwN2FhYTE3ODJjZTI5YTg3OTc0OTJhNDM4MDM4NDI0N2I4YWM0OWNmMWRlYTJhZDMwNTQ2NTQyMDY5N2YyM2VlYTQ1ZjY0N2E5ZDIyZWQ0MmEyZmEwMDk5MDgyODVjNTY5MjJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weUJhZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5QmFnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2JjNGNmOGM0MTM1ZTFkMmUxODc2MmRlOGI2N2FhYzMxYzk2ZTNhYTMxY2M0YWI0ZDYxMTk4N2UzN2RmODY4YzJiZDkyZDBjYzczYmI0Nzc0YmRiMzFjYjZiYWIxMWJhYWE4ODI2Y2MyMWU4Y2E3MWNmYzdmOTQ1NzYxMTAyNTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlTZXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMTdmODNmNTNmOTEyYWE5M2U4ZGVkOGU5NzY2Y2RjM2EyNjcxNzNlZWQzNWQ1MWYwNTQ4MmFjNWQ3NjEwMmM2Y2Q0MDM1ZmU5OTljYjhmNTAzYmNhZDI4ODUyYmM3YjQwODE0OGEzOTdmZjc0ZjkyNWIyOWMzODU5NWNhODBkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmQxY2VkNWYxMzc1NGNjZmY0OWRjMGY4MTBjOGU2ZDUyNzI3YmYyYzRlYzc3YThkZDlhNWZmNTc3NDk1YzRhZmNmNGRhMmI4YWY0MzZjODQzMzZhZjk5YTcxYzFjY2I3NDkwZjZiYTI5N2VjMTk1ZjNmMzdjYzc4MDFlYWRmNmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZTA5NWY3YzQ1ODU3MmI1MTBmYTMzNjAzYzIwNzNkMzEyOTE1MmRmM2Y3NGQzZTYyN2IzOTMxOTE5ZjY2OTRhNTZmZWI4NDk3OWY4YWU5NTQwZGQ0NjJjMDY4NGI2ZTViYjg5YmJkMGE4N2RlZjIyZWE5Mzc1M2RlZjc5MzRhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYzNDFkOGY1NjVkZDZhYTAzMDgyYTM2ZTEyNWFjOThjNTBjZGVhOWMzMjNhNjMzZGE4Y2M0MmU2YmNlOTBmNGQwMDYwN2Q0NTE2NDk0MTEwZTFiZmVkYTRjZjNiMjIxZTAzYjNlZWNmNDY5NmVjYTlkYmE2ZDZlOThhMjI0ZDhmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MzVhNmQwYjMwYWM3OGVlYzM4MjdhYTBmOTE5ZTk2ZTkyZjUzZDE2YTc1MzlmYmE2ODJmNzM5ZTE2ZGYxY2YzYjcyMDg2ZmQ2NzU0MmY3OTAwMmJiNzc2YjZhMGY0ODk4N2Y0YzA5NDVlNWM2ZDM5ZWMwOWNhNjE5NzgzM2VlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU4MzlmOTMzNjZmNjhmMDhkM2U1OTYxYjk0NTE4NWMwOTQxMDFiN2I3MzA3YjVkZmY3ZjM0NTg4ODg2OTQ0OGQxNzIwNmQ2MTg4OTc0NTgwYTE3ODlkNzRhN2M4NDlkZmU3NjVlNDNlNDQ1NTMzNmFlZDEzN2I4YjBjZjlkNDRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZkYjMyNDAwMzRjOTFhZjFjMGI0ZDU5Y2U1YzA5Y2Q4ZmIyMjNmYzUxYjE1NzAxMmVlZmUyZDMzMmJkZjdhNDM5MjA1NDZmZTU3MTMyZjBjNTEzNjMyYTkwOTUzZmYzNzEwMDQyOTQ5NmI3YjFjMGMwOWM1Nzc0NWUzM2Y3YWZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3N2UzNTJmZGM1ZmNhMzc3YjQwMWFjMTRhMDM0NjhlMTQ2ZTM1NzJhMDA5MTRhZjIwMjkzMWU1OGZmYjllMWE0MzI0NjA2ZmJiZDFmMjE0ZDNmNTc2ODE5NWRjZGNjOTRiNzIxZTEwZmVhZmRhMzBhMzc4NThlMmYzNDE0NzdjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiYWM0NzYwMTU2OTMyMTkzYjEwZTFlNTFiZDVhODE1YTNhNzExMDgxMDdiNWVjZTMyZDU4ZGYyZDE0ODI2ZjBiZjg1YWU3ODgxOWM2Mzc0Nzk3Njc0MDQ4OGJmYWM4NDg1Y2IwZjJhNGQ5Nzc1ZTZhMjViZjNmZWIzMWM0MTYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxMTc4NmEwYTVjYTgwOWNjYWMxZjE5ODA3YTNiNjEwYzQxMTMwMTgxNzk2YWVkMmUzN2RjYmUxY2Q4ZTQ1NzhiZDIwNTUxMmE1ZmM5ZmIzMTBmNGZjZDU5NDVkOTYyZWYyNDkzYzMxMjM0MTU3YTkzNGM1ZDVhYzM0NWJlN2E3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9zdHJlYW0tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vc3RyZWFtIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTAxZGYxNjA5OGI3OGE2YTMxY2MzNmFkMDc2ZjkzZmUyNWQ5NDYxNjFkNzYzNWI4OTg1NDZlNmMwZmY5ZDk4OGZjOTcxOGU5ZDQ4ZWJmN2IzZWRkODllNGYyNzM0Yjg4YzA5NGQ4MTc4OGYwNTQ3YzkzZmE4YWEzN2M5NzFiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGFmMTA5OTcyOTAxZWVjM2U3ZDljMDFkYWUyNmFlZDY3OWZmMTBjNmI4YzJlYWI5ZjdiODUwMmEyN2Q5MTVmNGZjMGQ4OGNmZjI1ZjE1YjY5ODVmNGUxY2UyYmQ0NTNiNzgzMTBiZjZjM2M2YTI1ODMzYzUxYjA3MDY1YjAzMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3ZGU2Y2JiNTFlMTZhMmRkNTIwZjdlNTY2MGFkZmEzZDM2YjlkMjBlZWJhN2NkM2QwMzZhMGQ1YmZkNmQxNGFkODVmNTYzOTAwZjE2YzZhMDdiYzU3MmZmODQzNmMzZmQxYWZkYzc1Njc3MjM3MDk4Mzc0M2U2ZDI0ZDc0N2MxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1N2U4Y2E5ZjUwNDAzZTBkNDY5NjJmYzg0NTM5NThlZmRjNTMwMzVhZDg5YmIwZjQ2Y2YxMjYzNjdkNzY5MjllOWIzYmUxM2VmOTVjNDUyNzZmY2I4NDYwNzlhNjQxNWQ3M2JkMzUzOTFmYTY2MGRmMTYyMDc5YmE3MTliMmRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZmQ1MmVmMzAyYzFmMTRjNjIwZmRkZDQzNzI3ZDgyMzI0MDNiOWJkMzU2MWUxZjEyM2RjZTlkNGU5YTEzYjU1YTJkMWVlNGFkODA3MDJmMjUxMTE5ZTlkNDkyYThjN2EzNDVmZTU3MWE0NzlkMzkxZTJiNzgxZmZiMTM4YzAwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE4ZDNjNWRjN2Q0MmJhNzJmZmM2ZmViMmQ5OTEzMWE3OTNjMzQxOTJjNTkxNzgzMzA5ZTBkYTkxZDEwMjkyMWQ4ZWQ1MDZkOTc5NWNmM2JlZmM2YTc5M2ZjNmFiMTgwMzFmZjJiYmFkZGJkYjQ3NjRjNmY0OWZmOGU5MDNiYmUyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9hc3luYy10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyMmNkMjMwZGMyMWY2YTkxNzQyNzQ1YzU4ZGY1OTI4MDZhZGU4ZjEzYjg3ZjI5MGYwODY4OWJjY2NjNGU2MTQ3NDRjZGY0M2Y4ZDlmM2VlNmExYzU2ZDkxMDgzMWUzOTdiNjY2YmNiODA5OGExMTI2MjAwMjUzODQwZmU2NTAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NDZiNmFiYmNlYTcwYjUxMjBhMDU0MjYzOWE5ODVkODk4YTI1ZjI1YTIzOTQwZWNjMGZhMjZlNmVmYzhkNjUyYTVkYjlhZTVhNzVlYzI3OGY3OWM0NGQ4ODAwZDk3YTdiZGVlYmZlNjU3MzNiM2FiNjY0YmIyMzUzYzQ2NTVlZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAADGASPiNAQAAjQEAACAAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc3siaW1wb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9oZWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEzMFkfMLAADzCwAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXhvIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOlsibWFrZUhlYXBab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyLGlzUGFzc2FibGUsbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxtYWtlT25jZUtpdCxrZXlzLHdhdGNoUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V4b1wiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NcIixbJGjNj19hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9rZXlzLmpzXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW1tcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1N0b3Jlc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtTdG9yZXN9XG4gKi9cbmNvbnN0IGRldGFjaGVkSGVhcFN0b3JlcyA9IEZhcignaGVhcFN0b3JlcycsIHtcbiAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkSGVhcFN0b3JlcyxcbiAgaXNTdG9yYWJsZTogaXNQYXNzYWJsZSxcblxuICBzZXRTdG9yZTogbWFrZVNjYWxhclNldFN0b3JlLFxuICBtYXBTdG9yZTogbWFrZVNjYWxhck1hcFN0b3JlLFxuICB3ZWFrTWFwU3RvcmU6IG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsXG4gIHdlYWtTZXRTdG9yZTogbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxcbn0pO1xuXG4vKipcbiAqIENyZWF0ZSBhIGhlYXAgKGluLW1lbW9yeSkgem9uZSB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgZXhvIGFuZCBzdG9yZSBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlTGFiZWxdXG4gKiBAcmV0dXJucyB7Wm9uZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIZWFwWm9uZSA9IChiYXNlTGFiZWwgPSAnaGVhcFpvbmUnKSA9PiB7XG4gIGNvbnN0IHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9ID0gbWFrZU9uY2VLaXQoYmFzZUxhYmVsLCBkZXRhY2hlZEhlYXBTdG9yZXMpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcGFyYW0ge2FueX0gX29wdGlvbnNcbiAqL1xuICBjb25zdCBtYWtlU3ViWm9uZSA9IChsYWJlbCwgX29wdGlvbnMpID0+XG4gICAgbWFrZUhlYXBab25lKGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcblxuICByZXR1cm4gRmFyKCdoZWFwWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihtYWtlRXhvLCBrZXlzLmV4byksXG4gICAgZXhvQ2xhc3M6IHdyYXBQcm92aWRlcihkZWZpbmVFeG9DbGFzcywga2V5cy5leG9DbGFzcyksXG4gICAgZXhvQ2xhc3NLaXQ6IHdyYXBQcm92aWRlcihkZWZpbmVFeG9DbGFzc0tpdCwga2V5cy5leG9DbGFzc0tpdCksXG4gICAgc3ViWm9uZTogd3JhcFByb3ZpZGVyKG1ha2VTdWJab25lKSxcblxuICAgIG1ha2VPbmNlLFxuICAgIHdhdGNoUHJvbWlzZSxcbiAgICBkZXRhY2hlZDogZGV0YWNoZWRIZWFwU3RvcmVzLmRldGFjaGVkLFxuICAgIGlzU3RvcmFibGU6IGRldGFjaGVkSGVhcFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMubWFwU3RvcmUpLFxuICAgIHNldFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLnNldFN0b3JlKSxcbiAgICB3ZWFrTWFwU3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha01hcFN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha1NldFN0b3JlKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlSGVhcFpvbmUobWFrZUhlYXBab25lKTtcbmhhcmRlbihtYWtlSGVhcFpvbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUhlYXBab25lIjpbIm1ha2VIZWFwWm9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAVbrH6eQIAAHkCAAAlAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2V4cG9ydHMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4va2V5cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi9rZXlzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9leHBvcnRzLmpzXCIsIFtdXSxbXCIuL21ha2Utb25jZS5qc1wiLCBbXV0sW1wiLi9rZXlzLmpzXCIsIFtdXSxbXCIuL2lzLXBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALUzVkSEDAAAhAwAAKwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaXMtcGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzUGFzc2FibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCByZWFsSXNQYXNzYWJsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChyZWFsSXNQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IGBpc1Bhc3NhYmxlYCBkaXJlY3RseSBmcm9tIGBAZW5kby9wYXNzLXN0eWxlYFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7c3BlY2ltZW4gaXMgUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlID0gc3BlY2ltZW4gPT4gcmVhbElzUGFzc2FibGUoc3BlY2ltZW4pOyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGwVpz8iBAAAIgQAACQAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2tleXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogQGltcG9ydCB7S2V5TWFrZXJzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBraW5kID0gbGFiZWwgPT4gYCR7bGFiZWx9X2tpbmRIYW5kbGVgO1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBzaW5nbGV0b24gPSBsYWJlbCA9PiBgJHtsYWJlbH1fc2luZ2xldG9uYDtcblxuLyoqXG4gKiBLZXlNYWtlcnMgY29tcGF0aWJsZSB3aXRoIGBAYWdvcmljL3ZhdC1kYXRhYC5cbiAqXG4gKiBAdHlwZSB7S2V5TWFrZXJzfVxuICovXG4gICAgICAgY29uc3QgYWdvcmljVmF0RGF0YUtleXMgPSB7XG4gIGV4b0NsYXNzOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4b0NsYXNzS2l0OiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4bzogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKSwgc2luZ2xldG9uKGxhYmVsKV0pLFxuICBzdG9yZTogbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pLFxuICB6b25lOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG59OyRozY9fb25jZS5hZ29yaWNWYXREYXRhS2V5cyhhZ29yaWNWYXREYXRhS2V5cyk7XG5oYXJkZW4oYWdvcmljVmF0RGF0YUtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYWdvcmljVmF0RGF0YUtleXMiOlsiYWdvcmljVmF0RGF0YUtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqRuNqvoOAAD6DgAAKQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VPbmNlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKi9cblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3QgZGVmYXVsdExhYmVsVG9LZXlzID0gbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pO1xuaGFyZGVuKGRlZmF1bHRMYWJlbFRvS2V5cyk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZSBPbmx5IHVzZWQgaW50ZXJuYWxseSBmb3IgZGlhZ25vc3RpY3MsIG5vdCBhdmFpbGFibGUgdG8gdXNlciBjb2RlXG4gKiBAcGFyYW0ge1N0b3Jlc30gc3RvcmVzXG4gKiBAcGFyYW0ge01hcFN0b3JlPHN0cmluZywgYW55Pn0gW2JhY2tpbmdTdG9yZV1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VPbmNlS2l0ID0gKGRlYnVnTmFtZSwgc3RvcmVzLCBiYWNraW5nU3RvcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgLyogV2UgbmVlZCBhIGRldGFjaGVkIHNldFN0b3JlIHNvIHRoYXQgaXQgaXNuJ3QgcGVyc2lzdGVkIGFzIHBhcnQgb2YgdGhlIHpvbmUuKi9cbiAgLyogVGhhdCB3YXksIG91ciB1c2VkS2V5cyBhcmUgb25seSB0cmFja2VkIGZvciB0aGUgY3VycmVudCBpbmNhcm5hdGlvbiwgd2hpY2gqL1xuICAvKiBpcyB3aGF0IHdlIHdhbnQuICBVc2luZyBgZGVidWdOYW1lYCBpbiB0aGUgbGFiZWwgaXMgZ29vZCBmb3IgZGlhZ25vc3RpY3MsKi9cbiAgLyogYW5kIHNpbmNlIGl0IGlzIG9ubHkgZm9yIGEgZGV0YWNoZWQgc3RvcmUsIGl0IHNob3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUqL1xuICAvKiBiYWNraW5nIHN0b3JlLiovXG4gIGNvbnN0IHVzZWRLZXlzID0gc3RvcmVzLmRldGFjaGVkKCkuc2V0U3RvcmUoYCR7ZGVidWdOYW1lfSB1c2VkIGtleXNgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuICBjb25zdCBhc3NlcnRPbmx5T25jZSA9IGtleSA9PiB7XG4gICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgRmFpbGBrZXkgJHtrZXl9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICF1c2VkS2V5cy5oYXMoa2V5KSB8fFxuICAgICAgRmFpbGBrZXkgJHtrZXl9IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiB0aGlzIHpvbmUgYW5kIGluY2FybmF0aW9uYDtcblxuICAgIC8qIE1hcmsgdGhpcyBrZXkgYXMgdXNlZC4gIFdlIG1ha2Ugbm8gYXR0ZW1wdCB0byByZWNvdmVyIGZyb20gaW52YWxpZCBtYWtlcnMqL1xuICAgIC8qIG9yIGJhY2tpbmdTdG9yZXMuKi9cbiAgICB1c2VkS2V5cy5hZGQoa2V5KTtcbiAgfTtcblxuICAvKipcbiAqIEVuc3VyZSB0aGUgd3JhcHBlZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciBpbmNhcm5hdGlvbi4gIEl0IGlzXG4gKiBleHBlY3RlZCB0byB1cGRhdGUgdGhlIGJhY2tpbmcgc3RvcmUgZGlyZWN0bHkuXG4gKlxuICogQHRlbXBsYXRlIHsoa2V5OiBzdHJpbmcsIC4uLnJlc3Q6IGFueVtdKSA9PiBhbnl9IFRcbiAqIEBwYXJhbSB7VH0gcHJvdmlkZXJcbiAqIEBwYXJhbSB7KGxhYmVsOiBzdHJpbmcpID0+IHN0cmluZ1tdfSBbbGFiZWxUb0tleXNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICBjb25zdCB3cmFwUHJvdmlkZXIgPSAocHJvdmlkZXIsIGxhYmVsVG9LZXlzID0gZGVmYXVsdExhYmVsVG9LZXlzKSA9PiB7XG4gICAgLyoqIEB0eXBlIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUmV0dXJuVHlwZTxUPn0gKi9cbiAgICBjb25zdCB3cmFwcGVyID0gKGxhYmVsLCAuLi5yZXN0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBsYWJlbFRvS2V5cyhsYWJlbCkpIHtcbiAgICAgICAgYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm92aWRlcihsYWJlbCwgLi4ucmVzdCk7XG4gICAgfTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtUfSAqLyAod3JhcHBlcik7XG4gIH07XG5cbiAgLyoqXG4gKiBUaGUgYmVzdCB3YXkgdG8gdW5kZXJzdGFuZCB0aGUgcHVycG9zZSBvZiBgbWFrZU9uY2VgIGlzIHRvIGZpcnN0IHVuZGVyc3RhbmRcbiAqIHdoYXQgYG1ha2VPbmNlYCBkb2VzIG9uIGEgZHVyYWJsZSB6b25lLiBVc2VkIGNvcnJlY3RseSwgYG1ha2VPbmNlYCBzaG91bGQgb25seVxuICogYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBvbiBhbnkgem9uZSxrZXkgcGFpciBkdXJpbmcgYW55IHZhdCBpbmNhcm5hdGlvbi5cbiAqIEdpdmVuIHRoYXQgY29uc3RyYWludCwgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHZhbHVlIGJvdW5kIHRvIHRoYXRcbiAqIHpvbmUsa2V5IHBhaXIsIGl0IG11c3QgaGF2ZSBiZWVuIGxlZnQgdGhlcmUgYnkgYSBwcmV2aW91cyBpbmNhcm5hdGlvbiBhbmRcbiAqIGBtYWtlT25jZWAgd2lsbCBzaW1wbHkgcmV0dXJuIGl0LiBJZiBub3QsIHRoZW4gYG1ha2VyKGtleSlgIGlzIGNhbGxlZCB0b1xuICogZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoYXQgc2xvdCwgd2hpY2ggd2lsbCBub3JtYWxseSBiZSBwcmVzZXJ2ZWRcbiAqIGJ5IHNpbWlsYXIgY2FsbHMgdG8gYG1ha2VPbmNlYCBpbiBmdXR1cmUgaW5jYXJuYXRpb25zIC0tLSB0aG91Z2ggdGhhdCB3aWxsIGJlXG4gKiB1cCB0byB0aGVtLlxuICpcbiAqIEFsc28gZW5zdXJlcyB0aGUgbWFrZXIgcmV0dXJucyBhIHN0b3JhYmxlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgWm9uZSBzbG90IHRvIHByb3ZpZGUuXG4gKiBAcGFyYW0geyhrZXk6IHN0cmluZykgPT4gVn0gbWFrZXIgQ2FsbGVkIHRvIGNyZWF0ZSBhIGZyZXNoIHZhbHVlIHRvIGZpbGwgYW4gZW1wdHkgc2xvdC5cbiAqIEByZXR1cm5zIHtWfSBUaGUgdmFsdWUgb2YgdGhlIGtleSdzIHNsb3QuXG4gKi9cbiAgY29uc3QgbWFrZU9uY2UgPSAoa2V5LCBtYWtlcikgPT4ge1xuICAgIGFzc2VydE9ubHlPbmNlKGtleSk7XG4gICAgaWYgKGJhY2tpbmdTdG9yZSAmJiBiYWNraW5nU3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBiYWNraW5nU3RvcmUuZ2V0KGtleSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gbWFrZXIoa2V5KTtcbiAgICBzdG9yZXMuaXNTdG9yYWJsZSh2YWx1ZSkgfHxcbiAgICAgIEZhaWxgbWFrZXIgcmV0dXJuIHZhbHVlICR7dmFsdWV9IGlzIG5vdCBzdG9yYWJsZWA7XG4gICAgYmFja2luZ1N0b3JlICYmIGJhY2tpbmdTdG9yZS5pbml0KGtleSwgdmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9KTtcbn07JGjNj19vbmNlLm1ha2VPbmNlS2l0KG1ha2VPbmNlS2l0KTtcbmhhcmRlbihtYWtlT25jZUtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT25jZUtpdCI6WyJtYWtlT25jZUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABgv9oYqw0AAKsNAAAtAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy93YXRjaC1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIiwiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIiwiUHJvbWlzZVdhdGNoZXJJIiwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE0sRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIG1ldGhvZCBndWFyZCBjYWxsYWJsZSB3aXRoIG9yIG1vcmUgYXJndW1lbnRzLCByZXR1cm5pbmcgdm9pZC5cbiAqL1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVySGFuZGxlciA9IE0uY2FsbChNLnJhdygpKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoKTtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIGludGVyZmFjZSB0aGF0IGhhcyBib3RoIG9uRnVsZmlsbGVkIGFuZCBvblJlamVjdGVkIGhhbmRsZXJzLlxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySGFuZGxlcihQcm9taXNlV2F0Y2hlckhhbmRsZXIpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVySSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlcicsIHtcbiAgb25GdWxmaWxsZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbiAgb25SZWplY3RlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBpbnRlcmZhY2UgdGhhdCBoYXMgb25seSBhbiBvbkZ1bGZpbGxlZCBoYW5kbGVyLlxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySShQcm9taXNlV2F0Y2hlckkpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZCcsIHtcbiAgb25GdWxmaWxsZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIG9ubHkgYW4gb25SZWplY3RlZCBoYW5kbGVyLlxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSShQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVyUmVqZWN0ZWRJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyUmVqZWN0ZWQnLCB7XG4gIG9uUmVqZWN0ZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByb21pc2VXYXRjaGVyXG4gKiBAcHJvcGVydHkgeyhmdWxmaWxtZW50OiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWR9IFtvbkZ1bGZpbGxlZF1cbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkfSBbb25SZWplY3RlZF1cbiAqL1xuXG4vKipcbiAqIEFkYXB0IGEgcHJvbWlzZSB3YXRjaGVyIG1ldGhvZCB0byBFLndoZW4uXG4gKiBAcGFyYW0ge1JlY29yZDxQcm9wZXJ0eUtleSwgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bj59IHRoYXRcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IHByb3BcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBwb3N0QXJnc1xuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJKFByb21pc2VXYXRjaGVyUmVqZWN0ZWRJKTtcbmNvbnN0IGNhbGxNZU1heWJlID0gKHRoYXQsIHByb3AsIHBvc3RBcmdzKSA9PiB7XG4gIGNvbnN0IGZuID0gdGhhdFtwcm9wXTtcbiAgaWYgKCFmbikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgYXNzZXJ0LnR5cGVvZihmbiwgJ2Z1bmN0aW9uJyk7XG4gIC8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhcmcgdmFsdWUgb3IgcmVhc29uXG4gKi9cbiAgY29uc3Qgd3JhcHBlZCA9IGFyZyA9PiB7XG4gICAgLyogRG9uJ3QgcmV0dXJuIGEgdmFsdWUsIHRvIHByZXZlbnQgRS53aGVuIGZyb20gc3Vic2NyaWJpbmcgdG8gYSByZXN1bHRpbmcqL1xuICAgIC8qIHByb21pc2UuKi9cbiAgICBhcHBseShmbiwgdGhhdCwgW2FyZywgLi4ucG9zdEFyZ3NdKTtcbiAgfTtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59O1xuXG4vKipcbiAqIFNoaW0gdGhlIHByb21pc2Ugd2F0Y2hlciBiZWhhdmlvdXIgd2hlbiBWYXREYXRhLndhdGNoUHJvbWlzZSBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7UHJvbWlzZTxhbnk+fSBwXG4gKiBAcGFyYW0ge1Byb21pc2VXYXRjaGVyfSB3YXRjaGVyXG4gKiBAcGFyYW0gey4uLnVua25vd259IHdhdGNoZXJBcmdzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgICAgIGNvbnN0IHdhdGNoUHJvbWlzZSA9IChwLCB3YXRjaGVyLCAuLi53YXRjaGVyQXJncykgPT4ge1xuICBQcm9taXNlLnJlc29sdmUocCkgPT09IHAgfHwgRmFpbGB3YXRjaFByb21pc2Ugb25seSB3YXRjaGVzIHByb21pc2VzYDtcbiAgY29uc3Qgb25GdWxmaWxsZWQgPSBjYWxsTWVNYXliZSh3YXRjaGVyLCAnb25GdWxmaWxsZWQnLCB3YXRjaGVyQXJncyk7XG4gIGNvbnN0IG9uUmVqZWN0ZWQgPSBjYWxsTWVNYXliZSh3YXRjaGVyLCAnb25SZWplY3RlZCcsIHdhdGNoZXJBcmdzKTtcbiAgb25GdWxmaWxsZWQgfHxcbiAgICBvblJlamVjdGVkIHx8XG4gICAgRmFpbGBwcm9taXNlIHdhdGNoZXIgbXVzdCBpbXBsZW1lbnQgYXQgbGVhc3Qgb25lIGhhbmRsZXIgbWV0aG9kYDtcbiAgdm9pZCBFLndoZW4ocCwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xufTskaM2PX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7XG5oYXJkZW4od2F0Y2hQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlByb21pc2VXYXRjaGVySGFuZGxlciI6WyJQcm9taXNlV2F0Y2hlckhhbmRsZXIiXSwiUHJvbWlzZVdhdGNoZXJJIjpbIlByb21pc2VXYXRjaGVySSJdLCJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiOlsiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIl0sIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIjpbIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4YOdgOc8AADnPAAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChuYXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBDb3B5U2V0fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtBbW91bnQsIEFtb3VudFZhbHVlLCBBc3NldFZhbHVlRm9yS2luZCwgQnJhbmQsIENvcHlCYWdBbW91bnQsIENvcHlTZXRBbW91bnQsIE1hdGhIZWxwZXJzLCBOYXRBbW91bnQsIE5hdFZhbHVlLCBTZXRBbW91bnQsIFNldFZhbHVlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiBOQjogQXNzZXRLaW5kIGlzIGJvdGggYSBjb25zdGFudCBmb3IgZW51bWVyYXRlZCB2YWx1ZXMgYW5kIGEgdHlwZSBmb3IgdGhvc2UgdmFsdWVzLiovXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEBlbnVtIHsodHlwZW9mIEFzc2V0S2luZClba2V5b2YgdHlwZW9mIEFzc2V0S2luZF19XG4gKi9cbiAgICAgICBjb25zdCBBc3NldEtpbmQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBOQVQ6ICduYXQnLFxuICBTRVQ6ICdzZXQnLFxuICBDT1BZX1NFVDogJ2NvcHlTZXQnLFxuICBDT1BZX0JBRzogJ2NvcHlCYWcnLFxufSk7JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuaGFyZGVuKEFzc2V0S2luZCk7XG5jb25zdCBhc3NldEtpbmROYW1lcyA9IGhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUsgKi9cbiAgICAgICBjb25zdCBhc3NlcnRBc3NldEtpbmQgPSBhbGxlZ2VkQUsgPT4ge1xuICBhc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspIHx8XG4gICAgRmFpbGBUaGUgYXNzZXRLaW5kICR7YWxsZWdlZEFLfSBtdXN0IGJlIG9uZSBvZiAke3EoYXNzZXRLaW5kTmFtZXMpfWA7XG59OyRozY9fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZSBicmFuZCBvZlxuICogZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHMgaGF2ZSB0d28gcGFydHM6IGFcbiAqIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0KSBhbmQgdGhlIHZhbHVlICh0aGUgYW5zd2VyXG4gKiB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW4gdGhlIHBocmFzZSBcIjUgYnVja3NcIiwgXCJidWNrc1wiIHRha2VzIHRoZSByb2xlXG4gKiBvZiB0aGUgYnJhbmQgYW5kIHRoZSB2YWx1ZSBpcyA1LiBBbW91bnRzIGNhbiBkZXNjcmliZSBmdW5naWJsZSBhbmRcbiAqIG5vbi1mdW5naWJsZSBkaWdpdGFsIGFzc2V0cy4gQW1vdW50cyBhcmUgcGFzcy1ieS1jb3B5IGFuZCBjYW4gYmUgbWFkZSBieSBhbmRcbiAqIHNlbnQgdG8gYW55b25lLlxuICpcbiAqIFRoZSBpc3N1ZXIgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlIG9mIHRoZSBhbW91bnQgaW4gcGF5bWVudHMgYW5kIHB1cnNlcy5cbiAqIFRoZSBpc3N1ZXIgbXVzdCBiZSBhYmxlIHRvIGRvIHRoaW5ncyBzdWNoIGFzIGFkZCBkaWdpdGFsIGFzc2V0cyB0byBhIHB1cnNlXG4gKiBhbmQgd2l0aGRyYXcgZGlnaXRhbCBhc3NldHMgZnJvbSBhIHB1cnNlLiBUbyBkbyBzbywgaXQgbXVzdCBrbm93IGhvdyB0byBhZGRcbiAqIGFuZCBzdWJ0cmFjdCBkaWdpdGFsIGFzc2V0cy4gUmF0aGVyIHRoYW4gaGFyZC1jb2RpbmcgYSBwYXJ0aWN1bGFyIHNvbHV0aW9uLFxuICogd2UgY2hvc2UgdG8gcGFyYW1ldGVyaXplIHRoZSBpc3N1ZXIgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcG9seW1vcnBoaWNcbiAqIGZ1bmN0aW9ucywgd2hpY2ggd2UgY2FsbCBgQW1vdW50TWF0aGAuIFRoZXNlIG1hdGggZnVuY3Rpb25zIGluY2x1ZGUgY29uY2VwdHNcbiAqIGxpa2UgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLlxuICpcbiAqIFdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29uZnVzaW9uIGFzIHRvIHdoYXQga2luZCBvZiBhc3NldCB3ZVxuICogYXJlIHVzaW5nLiBUaHVzLCBBbW91bnRNYXRoIGluY2x1ZGVzIGNoZWNrcyBvZiB0aGUgYGJyYW5kYCwgdGhlIHVuaXF1ZVxuICogaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldC4gSWYgdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW5cbiAqIEFtb3VudE1hdGgsIGFuIGVycm9yIGlzIHRocm93biBhbmQgdGhlIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzIHRoZSBicmFuZFxuICogdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgYW1vdW50IGJ5XG4gKiByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGUgZnVuY3Rpb24gYG1ha2VgIGFkZHMgdGhlIGJyYW5kXG4gKiB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT4gYW1vdW50KS4gVGhlIGZ1bmN0aW9uIGBjb2VyY2VgIHRha2VzIGFuIGFtb3VudFxuICogYW5kIGNoZWNrcyBpdCwgcmV0dXJuaW5nIGFuIGFtb3VudCAoYW1vdW50IC0+IGFtb3VudCkuXG4gKlxuICogRWFjaCBpc3N1ZXIgb2YgZGlnaXRhbCBhc3NldHMgaGFzIGFuIGFzc29jaWF0ZWQgYnJhbmQgaW4gYSBvbmUtdG8tb25lXG4gKiBtYXBwaW5nLiBJbiB1bnRydXN0ZWQgY29udGV4dHMsIHN1Y2ggYXMgaW4gYW5hbHl6aW5nIHBheW1lbnRzIGFuZCBhbW91bnRzLCB3ZVxuICogY2FuIGdldCB0aGUgYnJhbmQgYW5kIGZpbmQgdGhlIGlzc3VlciB3aGljaCBtYXRjaGVzIHRoZSBicmFuZC4gVGhlIGlzc3VlciBhbmRcbiAqIHRoZSBicmFuZCBtdXR1YWxseSB2YWxpZGF0ZSBlYWNoIG90aGVyLlxuICovXG5cbmNvbnN0IGhlbHBlcnMgPSB7XG4gIG5hdDogbmF0TWF0aEhlbHBlcnMsXG4gIHNldDogc2V0TWF0aEhlbHBlcnMsXG4gIGNvcHlTZXQ6IGNvcHlTZXRNYXRoSGVscGVycyxcbiAgY29weUJhZzogY29weUJhZ01hdGhIZWxwZXJzLFxufTtcblxuLyoqIEB0eXBlIHsodmFsdWU6IHVua25vd24pID0+ICduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZyd9IH0gKi9cbmNvbnN0IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kID0gdmFsdWUgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWx1ZSk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuICduYXQnO1xuICB9XG4gIGlmIChwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuICdzZXQnO1xuICB9XG4gIGlmIChtYXRjaGVzKHZhbHVlLCBNLnNldCgpKSkge1xuICAgIHJldHVybiAnY29weVNldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uYmFnKCkpKSB7XG4gICAgcmV0dXJuICdjb3B5QmFnJztcbiAgfVxuICAvKiBUT0RPIFRoaXMgaXNuJ3QgcXVpdGUgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UsIGluIGNhc2UgdmFsdWVQYXNzU3R5bGUqL1xuICAvKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbiAgLyogb2JqZWN0IGl0IGlzLiovXG4gIC8qIEFsc28sIHRoaXMga2luZCBvZiBtYW51YWwgbGlzdGluZyBpcyBhIG1haW50ZW5hbmNlIGhhemFyZCB3ZSovXG4gIC8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbiAgdGhyb3cgRmFpbGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbiAgICBwYXNzU3R5bGUsXG4gICl9YDtcbn07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzID0gdmFsdWUgPT5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKipcbiAqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZDxhbnk+LCBicmFuZD86IEJyYW5kPGFueT4pID0+IHZvaWR9XG4gKi8kaM2PX29uY2UuYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFzc2VydFZhbHVlR2V0SGVscGVycyk7XG5jb25zdCBvcHRpb25hbEJyYW5kQ2hlY2sgPSAoYWxsZWdlZEJyYW5kLCBicmFuZCkgPT4ge1xuICBpZiAoYnJhbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYWxsZWdlZEJyYW5kID09PSBicmFuZCB8fFxuICAgICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG4gICAgICAgIGJyYW5kLFxuICAgICAgKX1gO1xuICB9XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+IHwgdW5kZWZpbmVkfSBicmFuZFxuICogQHJldHVybnMge01hdGhIZWxwZXJzPGFueT59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBhc3NlcnRSZWNvcmQobGVmdEFtb3VudCwgJ2xlZnRBbW91bnQnKTtcbiAgYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCAncmlnaHRBbW91bnQnKTtcbiAgY29uc3QgeyB2YWx1ZTogbGVmdFZhbHVlLCBicmFuZDogbGVmdEJyYW5kIH0gPSBsZWZ0QW1vdW50O1xuICBjb25zdCB7IHZhbHVlOiByaWdodFZhbHVlLCBicmFuZDogcmlnaHRCcmFuZCB9ID0gcmlnaHRBbW91bnQ7XG4gIGFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsICdsZWZ0QnJhbmQnKTtcbiAgYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsICdyaWdodEJyYW5kJyk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsIGJyYW5kKTtcbiAgb3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsIGJyYW5kKTtcbiAgbGVmdEJyYW5kID09PSByaWdodEJyYW5kIHx8XG4gICAgRmFpbGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbiAgICAgIHJpZ2h0QnJhbmQsXG4gICAgKX0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuICBjb25zdCBsZWZ0SGVscGVycyA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuICBjb25zdCByaWdodEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG4gIGxlZnRIZWxwZXJzID09PSByaWdodEhlbHBlcnMgfHxcbiAgICBGYWlsYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xuICByZXR1cm4gbGVmdEhlbHBlcnM7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tBc3NldFZhbHVlRm9yS2luZDxLPiwgQXNzZXRWYWx1ZUZvcktpbmQ8Sz5dfVxuICovXG5jb25zdCBjb2VyY2VMUiA9IChoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkgPT4ge1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGFyYml0cmFyeSBzdWJ0eXBlKi9cbiAgcmV0dXJuIFtoLmRvQ29lcmNlKGxlZnRBbW91bnQudmFsdWUpLCBoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0QW1vdW50LlxuICogVGhlIG5vdGlvbiBvZiBcImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1wiIGRlcGVuZHMgb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhc1xuICogZGVmaW5lZCBieSB0aGUgTWF0aEhlbHBlcnMuIEZvciBleGFtcGxlLCB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhblxuICogcmVjdGFuZ2xlIEIgZGVwZW5kcyBvbiB3aGV0aGVyIHJlY3RhbmdsZSBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnlcbiAqIHRoZSBsb2dpYyBpbiBNYXRoSGVscGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzR1RFID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgcmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xufTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZCBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmRcbiAqIHRoZSBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbiAgICAgICBjb25zdCBBbW91bnRNYXRoID0ge1xuICAvKiBUT0RPIHVzZSBvdmVybG9hZGluZyB0byBoYW5kbGUgd2hlbiBCcmFuZCBoYXMgYW4gQXNzZXRLaW5kIGFuZCB3aGVuIGl0IGRvZXNuJ3QuKi9cbiAgLyogYSBBbW91bnRGb3JWYWx1ZSB1dGlsaXR5IGNvdWxkIGhlbHAgRFJZIHRob3NlIGNhc2VzLiovXG4gIC8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogRG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIEJyYW5kJ3MgQXNzZXRLaW5kIG1hdGNoZXMgdGhlIHZhbHVlJ3MuXG4gKlxuICogQHRlbXBsYXRlIHtCcmFuZDxhbnk+fSBCXG4gKiBAdGVtcGxhdGUge05hdFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWcgfCBTZXRWYWx1ZX0gVlxuICogQHBhcmFtIHtCfSBicmFuZFxuICogQHBhcmFtIHtWfSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtCIGV4dGVuZHMgQnJhbmQ8J25hdCc+XG4gKiAgICAgPyBOYXRBbW91bnRcbiAqICAgICA6IFYgZXh0ZW5kcyBOYXRWYWx1ZVxuICogICAgICAgPyBOYXRBbW91bnRcbiAqICAgICAgIDogViBleHRlbmRzIENvcHlTZXRcbiAqICAgICAgICAgPyBDb3B5U2V0QW1vdW50PFZbJ3BheWxvYWQnXVswXT5cbiAqICAgICAgICAgOiBWIGV4dGVuZHMgQ29weUJhZ1xuICogICAgICAgICAgID8gQ29weUJhZ0Ftb3VudDxWWydwYXlsb2FkJ11bMF1bMF0+XG4gKiAgICAgICAgICAgOiBWIGV4dGVuZHMgU2V0VmFsdWVcbiAqICAgICAgICAgICAgID8gU2V0QW1vdW50PFZbMF0+XG4gKiAgICAgICAgICAgICA6IG5ldmVyfVxuICovXG4gIG1ha2U6IChicmFuZCwgYWxsZWdlZFZhbHVlKSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHZhbGlkXG4gKiBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0F9IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIGNvZXJjZTogKGJyYW5kLCBhbGxlZ2VkQW1vdW50KSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWU6IGFsbGVnZWRWYWx1ZSB9ID0gYWxsZWdlZEFtb3VudDtcbiAgICBicmFuZCA9PT0gYWxsZWdlZEJyYW5kIHx8XG4gICAgICBGYWlsYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4gICAgLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIGFsbGVnZWRWYWx1ZSk7XG4gIH0sXG4gIC8qKlxuICogRXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QX0gYW1vdW50XG4gKiBAcmV0dXJucyB7QVsndmFsdWUnXX1cbiAqL1xuICBnZXRWYWx1ZTogKGJyYW5kLCBhbW91bnQpID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbW91bnQpLnZhbHVlLFxuICAvKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQuIFRoaXMgaXMgdGhlIGlkZW50aXR5XG4gKiBlbGVtZW50IGZvciBNYXRoSGVscGVycy5hZGQgYW5kIE1hdEhlbHBlcnMuc3VidHJhY3QuXG4gKlxuICogQHR5cGUge3tcbiAqICAgKGJyYW5kOiBCcmFuZCk6IEFtb3VudDwnbmF0Jz47XG4gKiAgIDxLIGV4dGVuZHMgQXNzZXRLaW5kPihicmFuZDogQnJhbmQ8Sz4sIGFzc2V0S2luZDogSyk6IEFtb3VudDxLPjtcbiAqIH19XG4gKi9cbiAgbWFrZUVtcHR5OiAoYnJhbmQsIGFzc2V0S2luZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICgnbmF0JykpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggbmFycm93aW5nIGZyb20gZnVuY3Rpb24gb3ZlcmxvYWQqL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlciBhbW91bnQgYXMgdGhlXG4gKiB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0gYW1vdW50XG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBtYWtlRW1wdHlGcm9tQW1vdW50OiBhbW91bnQgPT4ge1xuICAgIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGNvbnN0IGFzc2V0S2luZCA9IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGlzRW1wdHk6IChhbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBhc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCAnYnJhbmQnKTtcbiAgICBvcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLCBicmFuZCk7XG4gICAgY29uc3QgaCA9IGFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG4gICAgcmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiAgfSxcbiAgaXNHVEUsXG4gIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGVxdWFscyB0aGUgcmlnaHRBbW91bnQuIFdlIGFzc3VtZSB0aGF0IGlmXG4gKiBpc0dURSBpcyB0cnVlIGluIGJvdGggZGlyZWN0aW9ucywgaXNFcXVhbCBpcyBhbHNvIHRydWVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0F9IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBpc0VxdWFsOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgcmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aCBsZWZ0IGFuZFxuICogcmlnaHQuXG4gKlxuICogQHR5cGUge3tcbiAqICAgPEEgZXh0ZW5kcyBDb3B5QmFnLCBCIGV4dGVuZHMgQ29weUJhZz4oXG4gKiAgICAgbGVmdEFtb3VudDogQ29weUJhZ0Ftb3VudDxBPixcbiAqICAgICByaWdodEFtb3VudDogQ29weUJhZ0Ftb3VudDxCPixcbiAqICAgICBicmFuZD86IEJyYW5kLFxuICogICApOiBDb3B5QmFnQW1vdW50PEEgfCBCPjtcbiAqICAgPEEgZXh0ZW5kcyBBbW91bnQ+KGxlZnRBbW91bnQ6IEEsIHJpZ2h0QW1vdW50OiBBLCBicmFuZD86IEJyYW5kKTogQTtcbiAqIH19XG4gKi9cbiAgYWRkOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQWRkKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudCAoaS5lLlxuICogZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGUgcmlnaHRBbW91bnQpLiBJZiBsZWZ0QW1vdW50XG4gKiBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnQgKHN1YnRyYWN0aW9uIHJlc3VsdHMgaW4gYSBuZWdhdGl2ZSksIHRocm93IGFuXG4gKiBlcnJvci4gQmVjYXVzZSB0aGUgbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UXG4gKiBlcXVpdmFsZW50IHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gTFxuICogQHRlbXBsYXRlIHtBbW91bnR9IFJcbiAqIEBwYXJhbSB7TH0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtSfSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0wgZXh0ZW5kcyBSID8gTCA6IG5ldmVyfVxuICovXG4gIHN1YnRyYWN0OiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSB4XG4gKiBAcGFyYW0ge0F9IHlcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIG1pbjogKHgsIHksIGJyYW5kID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzR1RFKHgsIHksIGJyYW5kKVxuICAgICAgPyB5XG4gICAgICA6IGlzR1RFKHksIHgsIGJyYW5kKVxuICAgICAgICA/IHhcbiAgICAgICAgOiBGYWlsYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG4gIC8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IHhcbiAqIEBwYXJhbSB7QX0geVxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0F9XG4gKi9cbiAgbWF4OiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgaXNHVEUoeCwgeSwgYnJhbmQpXG4gICAgICA/IHhcbiAgICAgIDogaXNHVEUoeSwgeClcbiAgICAgICAgPyB5XG4gICAgICAgIDogRmFpbGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxufTskaM2PX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqIEBwYXJhbSB7QW1vdW50fSBhbW91bnQgKi9cbiAgICAgICBjb25zdCBnZXRBc3NldEtpbmQgPSBhbW91bnQgPT4ge1xuICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGFtb3VudDtcbiAgcmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbn07JGjNj19vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBc3NldEtpbmQiOlsiQXNzZXRLaW5kIl0sImFzc2VydEFzc2V0S2luZCI6WyJhc3NlcnRBc3NldEtpbmQiXSwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIjpbImFzc2VydFZhbHVlR2V0SGVscGVycyJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABf6b1eegUAAHoFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyJdLCJleHBvcnRzIjpbIm1ha2VBbW91bnRTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGg7JGjNj19pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTtcblxuLyoqIEBpbXBvcnQge0Ftb3VudCwgQXNzZXRLaW5kfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRTdG9yZVxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEFtb3VudFxuICogQHByb3BlcnR5IHsoZGVsdGE6IEFtb3VudDxLPikgPT4gdm9pZH0gaW5jcmVtZW50XG4gKiBAcHJvcGVydHkgeyhkZWx0YTogQW1vdW50PEs+KSA9PiBib29sZWFufSBkZWNyZW1lbnRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge29iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtBbW91bnRTdG9yZTxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBbW91bnRTdG9yZSA9IChzdGF0ZSwga2V5KSA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGdldEFtb3VudDogKCkgPT4gc3RhdGVba2V5XSxcbiAgICBpbmNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLmFkZChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIGlmIChBbW91bnRNYXRoLmlzR1RFKHN0YXRlW2tleV0sIGRlbHRhKSkge1xuICAgICAgICBzdGF0ZVtrZXldID0gQW1vdW50TWF0aC5zdWJ0cmFjdChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUFtb3VudFN0b3JlKG1ha2VBbW91bnRTdG9yZSk7XG5oYXJkZW4obWFrZUFtb3VudFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBbW91bnRTdG9yZSI6WyJtYWtlQW1vdW50U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQ7172XQGAAB0BgAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0FkZGl0aW9uYWxEaXNwbGF5SW5mbywgQXNzZXRLaW5kLCBEaXNwbGF5SW5mb30gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gYWxsZWdlZERpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcmV0dXJucyB7RGlzcGxheUluZm99XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VEaXNwbGF5SW5mbyA9IChhbGxlZ2VkRGlzcGxheUluZm8sIGFzc2V0S2luZCkgPT4ge1xuICBtdXN0TWF0Y2goYWxsZWdlZERpc3BsYXlJbmZvLCBEaXNwbGF5SW5mb1NoYXBlLCAnZGlzcGxheUluZm8nKTtcblxuICBpZiAoYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCA9PT0gYXNzZXRLaW5kIHx8XG4gICAgICBGYWlsYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWA7XG4gIH1cbiAgY29uc3QgZGlzcGxheUluZm8gPSBoYXJkZW4oeyAuLi5hbGxlZ2VkRGlzcGxheUluZm8sIGFzc2V0S2luZCB9KTtcblxuICBpZiAoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcykgfHxcbiAgICAgIEZhaWxgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmA7XG4gIH1cblxuICByZXR1cm4gZGlzcGxheUluZm87XG59OyRozY9fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzX00DTQIAAE0CAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW11dLFtcIi4vaXNzdWVyS2l0LmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaD6Qc8c8AADHPAAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyIsIi4vYW1vdW50TWF0aC5qcyIsIi4vZGlzcGxheUluZm8uanMiLCIuL3BheW1lbnRMZWRnZXIuanMiXSwiZXhwb3J0cyI6WyJoYXNJc3N1ZXIiLCJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJwcmVwYXJlSXNzdWVyS2l0IiwidXBncmFkZUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxGYWlsLGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLG1ha2VEdXJhYmxlWm9uZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHByZXBhcmVQYXltZW50TGVkZ2VyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzXCIsIFtbXCJtYWtlRHVyYWJsZVpvbmVcIixbJGjNj19hID0+IChtYWtlRHVyYWJsZVpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIixbJGjNj19hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLFskaM2PX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudExlZGdlclwiLFskaM2PX2EgPT4gKHByZXBhcmVQYXltZW50TGVkZ2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1NodXRkb3duV2l0aEZhaWx1cmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JztcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge0FkZGl0aW9uYWxEaXNwbGF5SW5mbywgUmVjb3ZlcnlTZXRzT3B0aW9uLCBJc3N1ZXJLaXQsIFBheW1lbnRMZWRnZXJ9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBVc2VkIF9vbmx5XyBpbnRlcm5hbGx5LCB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCBvciB0byByZXZpdmUgYW4gb2xkIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGUgT21pdHRlZCBmcm9tIGlzc3VlclJlY29yZFxuICogICBiZWNhdXNlIGl0IHdhcyBhZGRlZCBpbiBhbiB1cGdyYWRlLlxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0IHNldHVwSXNzdWVyS2l0ID0gKFxuICB7IG5hbWUsIGFzc2V0S2luZCwgZGlzcGxheUluZm8sIGVsZW1lbnRTaGFwZSB9LFxuICBpc3N1ZXJab25lLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbiAgLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG4gIGNvbnN0IGNsZWFuRGlzcGxheUluZm8gPSBjb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbywgYXNzZXRLaW5kKTtcbiAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwgJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAoZWxlbWVudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuICAvKiogQHR5cGUge1BheW1lbnRMZWRnZXI8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIGNvbnN0IHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSA9IHByZXBhcmVQYXltZW50TGVkZ2VyKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgY2xlYW5EaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBicmFuZCxcbiAgICBpc3N1ZXIsXG4gICAgbWludCxcbiAgICBtaW50UmVjb3ZlcnlQdXJzZSxcbiAgICBkaXNwbGF5SW5mbzogY2xlYW5EaXNwbGF5SW5mbyxcbiAgfSk7XG59O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyoqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlciByZWNvcmQgaXMgc3RvcmVkLiAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZID0gJ2lzc3Vlcic7XG4vKipcbiAqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlcktpdCdzIGBSZWNvdmVyeVNldHNPcHRpb25gIHN0YXRlIGlzIHN0b3JlZC5cbiAqIEludHJvZHVjZWQgYnkgYW4gdXBncmFkZSwgc28gbWF5IGJlIGFic2VudCBvbiBhIHByZWRlY2Vzc29yIGluY2FybmF0aW9uLiBTZWVcbiAqIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICovXG5jb25zdCBSRUNPVkVSWV9TRVRTX1NUQVRFID0gJ3JlY292ZXJ5U2V0c1N0YXRlJztcblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byB1cGdyYWRlIGEgcHJlZGVjZXNzb3IgaXNzdWVyS2l0LiBVc2UgYG1ha2VEdXJhYmxlSXNzdWVyS2l0YCB0b1xuICogbWFrZSBhIG5ldyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSBbcmVjb3ZlcnlTZXRzT3B0aW9uXSBBZGRlZCBpbiB1cGdyYWRlLCBzbyBsYXN0XG4gKiAgIGFuZCBvcHRpb25hbC4gU2VlIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHVwZ3JhZGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBpc3N1ZXJSZWNvcmQgPSBpc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9IGlzc3VlckJhZ2dhZ2UuaGFzKFJFQ09WRVJZX1NFVFNfU1RBVEUpXG4gICAgPyBpc3N1ZXJCYWdnYWdlLmdldChSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgIDogJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlmIChcbiAgICBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyAmJlxuICAgIHJlY292ZXJ5U2V0c09wdGlvbiA9PT0gJ2hhc1JlY292ZXJ5U2V0cydcbiAgKSB7XG4gICAgRmFpbGBDYW5ub3QgKHlldD8pIHVwZ3JhZGUgZnJvbSAnbm9SZWNvdmVyeVNldHMnIHRvICdoYXNSZWNvdmVyeVNldHMnYDtcbiAgfVxuICAvKiBFeHRhbnQgc2V0cyBhcmUgbm90IGN1cnJlbnRseSBkZWxldGVkLiBJZiB0aGUgbmV3IG9wdGlvbiBpcyovXG4gIC8qICdub1JlY292ZXJ5U2V0cycsIHRoZXkgd29uJ3QgYmUgdXNlZCBidXQgZXh0YW50IG9uZXMgd2lsbCByZW1haW4uIEZ1dHVyZSovXG4gIC8qIHVwZ3JhZGVzIG1heSBtYWtlIGl0IHBvc3NpYmxlIHRvIGRlbGV0ZSBlbGVtZW50cyBmcm9tIHRoZW0uKi9cbiAgY29uc3QgcmVjb3ZlcnlTZXRzU3RhdGUgPSByZWNvdmVyeVNldHNPcHRpb24gfHwgb2xkUmVjb3ZlcnlTZXRzU3RhdGU7XG4gIHJldHVybiBzZXR1cElzc3VlcktpdChcbiAgICBpc3N1ZXJSZWNvcmQsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xufTskaM2PX29uY2UudXBncmFkZUlzc3VlcktpdCh1cGdyYWRlSXNzdWVyS2l0KTtcbmhhcmRlbih1cGdyYWRlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBEb2VzIGJhZ2dhZ2UgYWxyZWFkeSBoYXZlIGFuIGlzc3VlcktpdD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuICAgICAgIGNvbnN0IGhhc0lzc3VlciA9IGJhZ2dhZ2UgPT4gYmFnZ2FnZS5oYXMoSU5TVEFOQ0VfS0VZKTtcblxuLyoqXG4gKiBgZWxlbWVudFNoYXBlYCwgbWF5IG9ubHkgYmUgcHJlc2VudCBmb3IgY29sbGVjdGlvbi1zdHlsZSBhbW91bnRzLiBJZiBwcmVzZW50LFxuICogaXQgaXMgYSBgUGF0dGVybmAgdGhhdCBldmVyeSBlbGVtZW50IG9mIHRoaXMgaXNzdWVyS2l0cydzIGFtb3VudHMgbXVzdFxuICogc2F0aXNmeS4gRm9yIGV4YW1wbGUsIHRoZSBab2UgSW52aXRhdGlvbiBpc3N1ZXJLaXQgdXNlcyBhbiBlbGVtZW50U2hhcGVcbiAqIGRlc2NyaWJpbmcgdGhlIGludml0YXRpb24gZGV0YWlscyBmb3IgYW4gaW5kaXZpZHVhbCBpbnZpdGF0aW9uLiBBbiBpbnZpdGF0aW9uXG4gKiBwdXJzZSBvciBwYXltZW50IGhhcyBhbiBhbW91bnQgdGhhdCBjYW4gb25seSBiZSBhIHNldCBvZiB0aGVzZS4gKFRob3VnaFxuICogdHlwaWNhbGx5LCB0aGUgYW1vdW50IG9mIGFuIGludml0YXRpb24gcGF5bWVudCBpcyBhIHNpbmdsZXRvbiBzZXQuIFN1Y2ggYVxuICogcGF5bWVudCBpcyBvZnRlbiByZWZlcnJlZCB0byBpbiB0aGUgc2luZ3VsYXIgYXMgXCJhbiBpbnZpdGF0aW9uXCIuKVxuICpcbiAqIGByZWNvdmVyeVNldHNPcHRpb25gIGFkZGVkIGluIHVwZ3JhZGUuIE5vdGUgdGhhdCBgSXNzdWVyT3B0aW9uc1JlY29yZGAgaXNcbiAqIG5ldmVyIHN0b3JlZCwgc28gd2UgbmV2ZXIgbmVlZCB0byB3b3JyeSBhYm91dCBpbmhlcml0aW5nIG9uZSBmcm9tIGFcbiAqIHByZWRlY2Vzc29yIHByZWRhdGluZyB0aGUgaW50cm9kdWN0aW9uIG9mIHJlY292ZXJ5IHNldHMuIFNlZVxuICogYFJlY292ZXJ5U2V0c09wdGlvbmAgZm9yIGRlZmF1bHRpbmcgYmVoYXZpb3IuXG4gKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e1xuICogICBlbGVtZW50U2hhcGU6IFBhdHRlcm47XG4gKiAgIHJlY292ZXJ5U2V0c09wdGlvbjogUmVjb3ZlcnlTZXRzT3B0aW9uO1xuICogfT59IElzc3Vlck9wdGlvbnNSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIG1ha2UgYSBfbmV3XyBkdXJhYmxlIGlzc3VlciwgaS5lLiwgdGhlIGluaXRpYWwgaW5jYXJuYXRpb24gb2ZcbiAqIHRoYXQgaXNzdWVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICpcbiAqICAgVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnMgZnJvbSB0aGVcbiAqICAgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGUgZGVmYXVsdCwgaXMgdXNlZCBmb3JcbiAqICAgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaM2PX29uY2UuaGFzSXNzdWVyKGhhc0lzc3Vlcik7XG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyRGF0YSA9IGhhcmRlbih7XG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICB9KTtcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSwgaXNzdWVyRGF0YSk7XG4gIGNvbnN0IGlzc3VlclpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG4gIGNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlID0gcmVjb3ZlcnlTZXRzT3B0aW9uIHx8ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpc3N1ZXJCYWdnYWdlLmluaXQoUkVDT1ZFUllfU0VUU19TVEFURSwgcmVjb3ZlcnlTZXRzU3RhdGUpO1xuICByZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG4gICAgaXNzdWVyRGF0YSxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIFVzZWQgdG8gZWl0aGVyIHJldml2ZSBhIHByZWRlY2Vzc29yIGlzc3VlcktpdCwgb3IgdG8gbWFrZSBhIG5ldyBkdXJhYmxlIG9uZVxuICogaWYgaXQgaXMgYWJzZW50LCBhbmQgdG8gcGxhY2UgaXQgaW4gYmFnZ2FnZSBmb3IgdGhlIG5leHQgc3VjY2Vzc29yLlxuICpcbiAqIEB0ZW1wbGF0ZSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gT1xuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEsgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKlxuICogICBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVycyBmcm9tIHRoZVxuICogICBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZSBkZWZhdWx0LCBpcyB1c2VkIGZvclxuICogICBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb11cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge099IFtvcHRpb25zXVxuICogQHJldHVybnMge09bJ2VsZW1lbnRTaGFwZSddIGV4dGVuZHMgVHlwZWRQYXR0ZXJuPGluZmVyIFQgZXh0ZW5kcyBLZXk+XG4gKiAgICAgPyBJc3N1ZXJLaXQ8SywgVD5cbiAqICAgICA6IElzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBoYXZlIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgSXNzdWVyT3B0aW9uc1JlY29yZCovXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBpZiAoaGFzSXNzdWVyKGlzc3VlckJhZ2dhZ2UpKSB7XG4gICAgY29uc3QgeyBlbGVtZW50U2hhcGU6IF8gPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID1cbiAgICAgIG9wdGlvbnM7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gdXBncmFkZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgcmVjb3ZlcnlTZXRzT3B0aW9uLFxuICAgICk7XG5cbiAgICAvKiBUT0RPIGNoZWNrIGNvbnNpc3RlbmN5IHdpdGggbmFtZSwgYXNzZXRLaW5kLCBkaXNwbGF5SW5mbywgZWxlbWVudFNoYXBlLiovXG4gICAgLyogQ29uc2lzdGVuY3kgZWl0aGVyIG1lYW5zIHRoYXQgdGhlc2UgYXJlIHRoZSBzYW1lLCBvciB0aGF0IHRoZXkgZGlmZmVyKi9cbiAgICAvKiBpbiBhIGRpcmVjdGlvbiB3ZSBhcmUgcHJlcGFyZWQgdG8gdXBncmFkZS4gTm90ZSB0aGF0IGl0IGlzIHRoZSovXG4gICAgLyogcmVzcG9uc2liaWxpdHkgb2YgYHVwZ3JhZGVJc3N1ZXJLaXRgIHRvIGNoZWNrIGNvbnNpc3RlbmN5IG9mKi9cbiAgICAvKiBgcmVjb3ZlcnlTZXRzT3B0aW9uYCwgc28gY29udGludWUgdG8gbm90IGRvIHRoYXQgaGVyZS4qL1xuXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlIHBhcmFtZXRlciBjb25mdXNpb24uKi9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlzc3VlcktpdCA9IG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgICAgaXNzdWVyQmFnZ2FnZSxcbiAgICAgIG5hbWUsXG4gICAgICBhc3NldEtpbmQsXG4gICAgICBkaXNwbGF5SW5mbyxcbiAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IHRvIHRoZSB0eXBlIHBhcmFtZXRlciovXG4gICAgcmV0dXJuIGlzc3VlcktpdDtcbiAgfVxufTskaM2PX29uY2UucHJlcGFyZUlzc3VlcktpdChwcmVwYXJlSXNzdWVyS2l0KTtcbmhhcmRlbihwcmVwYXJlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCB0aGF0IGlzIGVmZmVjdGl2ZWx5IG5vbi1kdXJhYmxlLiBUaGlzIGlzXG4gKiBjdXJyZW50bHkgZG9uZSBieSBtYWtpbmcgYSBkdXJhYmxlIG9uZSBpbiBhIGJhZ2dhZ2Ugbm90IHJlYWNoYWJsZSBmcm9tXG4gKiBhbnl3aGVyZS4gVE9ETyBPbmNlIHJlYnVpbHQgb24gem9uZXMsIHRoaXMgc2hvdWxkIGluc3RlYWQganVzdCBidWlsZCBvbiB0aGVcbiAqIHZpcnR1YWwgem9uZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzcxMTZcbiAqXG4gKiBDdXJyZW50bHkgdXNlZCBmb3IgdGVzdGluZyBvbmx5LiBTaG91bGQgcHJvYmFibHkgY29udGludWUgdG8gYmUgdXNlZCBmb3JcbiAqIHRlc3Rpbmcgb25seS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBAdGVtcGxhdGUge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtPPXt9XVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljXG4gKiAgIG1hdGhIZWxwZXJzIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiAgIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb25cbiAqICAgdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtPfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtPWydlbGVtZW50U2hhcGUnXSBleHRlbmRzIFR5cGVkUGF0dGVybjxpbmZlciBUIGV4dGVuZHMgS2V5PlxuICogICAgID8gSXNzdWVyS2l0PEssIFQ+XG4gKiAgICAgOiBJc3N1ZXJLaXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSXNzdWVyS2l0ID0gKFxuICBuYW1lLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgTyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0JywgeyBkdXJhYmxlOiB0cnVlIH0pLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGRpc3BsYXlJbmZvLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgeyBlbGVtZW50U2hhcGUsIHJlY292ZXJ5U2V0c09wdGlvbiB9LFxuICApOyRozY9fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidXBncmFkZUlzc3VlcktpdCI6WyJ1cGdyYWRlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABU59wlEwYAABMGAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5RVEsbWFrZUNvcHlCYWcsbXVzdE1hdGNoLE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weUJhZ1wiLFskaM2PX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIixbJGjNj19hID0+IChiYWdJc1N1cGVyYmFnID0gJGjNj19hKV1dLFtcImJhZ1VuaW9uXCIsWyRozY9fYSA9PiAoYmFnVW5pb24gPSAkaM2PX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGJhZ0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXRoSGVscGVyc30gZnJvbSAnLi4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtDb3B5QmFnfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cblxuLyoqIEB0eXBlIHtDb3B5QmFnfSAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weUJhZyhbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59ICovXG4gICAgICAgY29uc3QgY29weUJhZ01hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGJhZyA9PiB7XG4gICAgbXVzdE1hdGNoKGJhZywgTS5iYWcoKSwgJ2JhZyBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gYmFnO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogYmFnID0+IGdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBiYWdJc1N1cGVyYmFnLFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogYmFnVW5pb24sXG4gIGRvU3VidHJhY3Q6IGJhZ0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFod70kmBgAAJgYAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weVNldCxtdXN0TWF0Y2gsTSxnZXRDb3B5U2V0S2V5cyxzZXRJc1N1cGVyc2V0LHNldERpc2pvaW50VW5pb24sc2V0RGlzam9pbnRTdWJ0cmFjdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoc2V0SXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hdGhIZWxwZXJzfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0NvcHlTZXR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJ1xuICovXG5cbi8qKiBAdHlwZSB7Q29weVNldH0gKi9cbmNvbnN0IGVtcHR5ID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vKiogQHR5cGUge01hdGhIZWxwZXJzPENvcHlTZXQ+fSAqL1xuICAgICAgIGNvbnN0IGNvcHlTZXRNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBzZXQgPT4ge1xuICAgIG11c3RNYXRjaChzZXQsIE0uc2V0KCksICdzZXQgb2YgYW1vdW50Jyk7XG4gICAgcmV0dXJuIHNldDtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IHNldCA9PiBnZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogc2V0SXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiBrZXlFUSxcbiAgZG9BZGQ6IHNldERpc2pvaW50VW5pb24sXG4gIGRvU3VidHJhY3Q6IHNldERpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABnzLX7PBgAAzwYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE5hdCxpc05hdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXSxbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge01hdGhIZWxwZXJzLCBOYXRWYWx1ZX0gZnJvbSAnLi4vdHlwZXMuanMnICovXG5cbmNvbnN0IGVtcHR5ID0gMG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLSB0aGVcbiAqIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZSBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2Ugcm91bmRpbmdcbiAqIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGVcbiAqIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyIGRlYWxzIHdpdGhcbiAqIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuICAgICAgIGNvbnN0IG5hdE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IG5hdCA9PiB7XG4gICAgLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuICAgIGFzc2VydC50eXBlb2YobmF0LCAnYmlnaW50Jyk7XG4gICAgaXNOYXQobmF0KSB8fCBGYWlsYHZhbHVlICR7bmF0fSBtdXN0IGJlIGEgbmF0dXJhbCBudW1iZXJgO1xuICAgIHJldHVybiBOYXQobmF0KTtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IG5hdCA9PiBuYXQgPT09IGVtcHR5LFxuICBkb0lzR1RFOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgPj0gcmlnaHQsXG4gIGRvSXNFcXVhbDogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID09PSByaWdodCxcbiAgLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbiAgZG9BZGQ6IChsZWZ0LCByaWdodCkgPT4gbGVmdCArIHJpZ2h0LFxuICBkb1N1YnRyYWN0OiAobGVmdCwgcmlnaHQpID0+IE5hdChsZWZ0IC0gcmlnaHQpLFxufSk7JGjNj19vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD3cNf/9BwAA/QcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLFskaM2PX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsWyRozY9fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7TWF0aEhlbHBlcnMsIFNldFZhbHVlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuLyogT3BlcmF0aW9ucyBmb3IgYXJyYXlzIHdpdGggdW5pcXVlIG9iamVjdHMgaWRlbnRpZnlpbmcgYW5kIHByb3ZpZGluZyovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGFzc2V0cy4gVXNlZCBmb3IgWm9lIGludml0ZXMuKi9cbi8qKiBAdHlwZSB7U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eSA9IGhhcmRlbihbXSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBhcnJheS1iYXNlZCBTZXRNYXRoIHdpdGggQ29weVNldC1iYXNlZCBDb3B5U2V0TWF0aFxuICogQHR5cGUge01hdGhIZWxwZXJzPFNldFZhbHVlPn1cbiAqL1xuICAgICAgIGNvbnN0IHNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGxpc3QgPT4ge1xuICAgIGxpc3QgPSBjb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuICAgIC8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4gICAgLyogKiBwYXNzLWJ5LWNvcHkgcHJpbWl0aXZlcywqL1xuICAgIC8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4gICAgLyogKiByZW1vdGFibGVzLiovXG4gICAgYXNzZXJ0S2V5KGxpc3QpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogbGlzdCA9PiBwYXNzU3R5bGVPZihsaXN0KSA9PT0gJ2NvcHlBcnJheScgJiYgbGlzdC5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGVsZW1lbnRzSXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiAoeCwgeSkgPT4gZWxlbWVudHNDb21wYXJlKHgsIHkpID09PSAwLFxuICBkb0FkZDogZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuICBkb1N1YnRyYWN0OiBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMnLESlgFAABYBQAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBc3NldEtpbmQsIEJyYW5kLCBQYXltZW50fSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy96b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cblxuLyogVE9ETyBUeXBlIEludGVyZmFjZUd1YXJkIGJldHRlciB0aGFuIEludGVyZmFjZUd1YXJkPGFueT4qL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8YW55Pn0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEssIGFueT59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUGF5bWVudEtpbmQgPSAoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKSA9PiB7XG4gIGNvbnN0IG1ha2VQYXltZW50ID0gaXNzdWVyWm9uZS5leG9DbGFzcyhcbiAgICBgJHtuYW1lfSBwYXltZW50YCxcbiAgICBQYXltZW50SSxcbiAgICBpbml0RW1wdHksXG4gICAge1xuICAgICAgZ2V0QWxsZWdlZEJyYW5kKCkge1xuICAgICAgICByZXR1cm4gYnJhbmQ7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgW3RhZ10gZm9yIHRhZ2dlZCB0eXBlIG5vdCBkZWZpbmVkIGluIHJ1bnRpbWUqL1xuICByZXR1cm4gbWFrZVBheW1lbnQ7XG59OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudEtpbmQocHJlcGFyZVBheW1lbnRLaW5kKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADYJ0h2vjYAAL42AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXR0ZXJucyIsIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxhbm5vdGF0ZUVycm9yLFgsaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLEFtb3VudE1hdGgscHJlcGFyZVBheW1lbnRLaW5kLHByZXBhcmVQdXJzZUtpbmQsQnJhbmRJLG1ha2VJc3N1ZXJJbnRlcmZhY2VzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50LmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudEtpbmRcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJwcmVwYXJlUHVyc2VLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRJXCIsWyRozY9fYSA9PiAoQnJhbmRJID0gJGjNj19hKV1dLFtcIm1ha2VJc3N1ZXJJbnRlcmZhY2VzXCIsWyRozY9fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LXZhdCc7XG4gKiBAaW1wb3J0IHtBbW91bnRTdG9yZX0gZnJvbSAnLi9hbW91bnRTdG9yZS5qcyc7XG4gKiBAaW1wb3J0IHtBbW91bnQsIEFzc2V0S2luZCwgRGlzcGxheUluZm8sIFBheW1lbnRMZWRnZXIsIFBheW1lbnQsIEJyYW5kLCBSZWNvdmVyeVNldHNPcHRpb24sIFB1cnNlLCBJc3N1ZXIsIE1pbnR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge1NldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcmV0dXJucyB7VHlwZWRQYXR0ZXJuPEFtb3VudDxLPj59XG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZSA9IChicmFuZCwgYXNzZXRLaW5kLCBlbGVtZW50U2hhcGUpID0+IHtcbiAgbGV0IHZhbHVlU2hhcGU7XG4gIHN3aXRjaCAoYXNzZXRLaW5kKSB7XG4gICAgY2FzZSAnbmF0Jzoge1xuICAgICAgdmFsdWVTaGFwZSA9IE0ubmF0KCk7XG4gICAgICBlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnc2V0Jzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5rZXkoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0uYW5kKE0ua2V5KCksIGVsZW1lbnRTaGFwZSkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5zZXRPZihlbGVtZW50U2hhcGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYmFnKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5iYWdPZihlbGVtZW50U2hhcGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIEZhaWxgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBoYXJkZW4oe1xuICAgIGJyYW5kLCAvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG4gICAgdmFsdWU6IHZhbHVlU2hhcGUsXG4gIH0pO1xuICByZXR1cm4gYW1vdW50U2hhcGU7XG59O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZiBwYXltZW50cy4gQWxsXG4gKiBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50TGVkZ2VyID0gKFxuICBpc3N1ZXJab25lLFxuICBuYW1lLFxuICBhc3NldEtpbmQsXG4gIGRpc3BsYXlJbmZvLFxuICBlbGVtZW50U2hhcGUsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7QnJhbmQ8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbiAgY29uc3QgYnJhbmQgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBicmFuZGAsIEJyYW5kSSwge1xuICAgIGlzTXlJc3N1ZXIoYWxsZWdlZElzc3Vlcikge1xuICAgICAgLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG4gICAgICByZXR1cm4gYWxsZWdlZElzc3VlciA9PT0gaXNzdWVyO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIC8qIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC4qL1xuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgZ2V0QW1vdW50U2hhcGUoKSB7XG4gICAgICByZXR1cm4gYW1vdW50U2hhcGU7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCB7IElzc3VlckksIE1pbnRJLCBQYXltZW50SSwgUHVyc2VJS2l0IH0gPSBtYWtlSXNzdWVySW50ZXJmYWNlcyhcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgYW1vdW50U2hhcGUsXG4gICk7XG5cbiAgY29uc3QgbWFrZVBheW1lbnQgPSBwcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKTtcblxuICAvKiogQHR5cGUge1NodXRkb3duV2l0aEZhaWx1cmV9ICovXG4gIGNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUgPSByZWFzb24gPT4ge1xuICAgIC8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzQqL1xuICAgIGlmIChvcHRTaHV0ZG93bldpdGhGYWlsdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiAgICAgIH0gY2F0Y2ggKGVyckluU2h1dGRvd24pIHtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnJJblNodXRkb3duLCBYYENhdXNlZCBieTogJHtyZWFzb259YCk7XG4gICAgICAgIHRocm93IGVyckluU2h1dGRvd247XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IHJlYXNvbjtcbiAgfTtcblxuICAvKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuICBjb25zdCBwYXltZW50TGVkZ2VyID0gaXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRMZWRnZXInLCB7XG4gICAgdmFsdWVTaGFwZTogYW1vdW50U2hhcGUsXG4gIH0pO1xuXG4gIC8qKlxuICogQSAobm9uLWVtcHR5KSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIiBwYXltZW50cy5cbiAqIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZSBwYXltZW50cyBhcmVcbiAqIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3Zlcnkgd2l0aCB0aGlzIHdlYWttYXBcbiAqIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZSBpbi4gQSBidW5jaCBvZlxuICogaW50ZXJlc3RpbmcgaW52YXJpYW50cyBoZXJlOlxuICpcbiAqIC0gRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2Agd2Vha01hcCBpc1xuICogICBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAtIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5IGluIGF0IG1vc3Qgb25lXG4gKiAgIHJlY292ZXJ5IHNldC5cbiAqIC0gQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogLSBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0byBpdC5cbiAqIC0gQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoYXQgcHVyc2UgYW5kXG4gKiAgIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnYCwgdGhlbiBub3RoaW5nIHNob3VsZCBldmVyIGJlXG4gKiBhZGRlZCB0byB0aGlzIFdlYWtTdG9yZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIFNldFN0b3JlPFBheW1lbnQ+Pn1cbiAqL1xuICBjb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzID0gaXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuICAvKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuaW5pdGAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSBbb3B0UmVjb3ZlcnlTZXRdXG4gKi9cbiAgY29uc3QgaW5pdFBheW1lbnQgPSAocGF5bWVudCwgYW1vdW50LCBvcHRSZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGlmIChyZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJykge1xuICAgICAgb3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHdoZW4gcmVjb3ZlclNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJywgb3B0UmVjb3ZlcnlTZXQgbXVzdCBiZSBlbXB0eWA7XG4gICAgfVxuICAgIGlmIChvcHRSZWNvdmVyeVNldCAhPT0gdW5kZWZpbmVkICYmICFBbW91bnRNYXRoLmlzRW1wdHkoYW1vdW50KSkge1xuICAgICAgb3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsIG9wdFJlY292ZXJ5U2V0KTtcbiAgICB9XG4gICAgcGF5bWVudExlZGdlci5pbml0KHBheW1lbnQsIGFtb3VudCk7XG4gIH07XG5cbiAgLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuZGVsZXRlYC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqL1xuICBjb25zdCBkZWxldGVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG4gICAgaWYgKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKSB7XG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IHBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG4gICAgICByZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuICBjb25zdCBjb2VyY2UgPSBhbGxlZ2VkQW1vdW50ID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbGxlZ2VkQW1vdW50KTtcbiAgLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBib29sZWFufSAqL1xuXG4gIC8qKlxuICogTWV0aG9kcyBsaWtlIGRlcG9zaXQoKSBoYXZlIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgYG9wdEFtb3VudFNoYXBlYFxuICogd2hpY2gsIGlmIHByZXNlbnQsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBwYXltZW50LiBUaGlzXG4gKiBoZWxwZXIgZnVuY3Rpb24gZG9lcyB0aGF0IGNoZWNrLlxuICpcbiAqIE5vdGU6IGBvcHRBbW91bnRTaGFwZWAgaXMgdXNlci1zdXBwbGllZCB3aXRoIG5vIHByZXZpb3VzIHZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHBheW1lbnRCYWxhbmNlXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQgPSAocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKSA9PiB7XG4gICAgaWYgKG9wdEFtb3VudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUsICdhbW91bnQnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IGFzc2VydExpdmVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5oYXMocGF5bWVudCkgfHxcbiAgICAgIEZhaWxgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG4gICAgICAgIGJyYW5kLFxuICAgICAgKX0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmA7XG4gIH07XG5cbiAgLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS5kZXBvc2l0XG4gKlxuICogQHBhcmFtIHtBbW91bnRTdG9yZX0gYmFsYW5jZVN0b3JlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuICBjb25zdCBkZXBvc2l0SW50ZXJuYWwgPSAoXG4gICAgYmFsYW5jZVN0b3JlLFxuICAgIHNyY1BheW1lbnQsXG4gICAgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgICFpc1Byb21pc2Uoc3JjUGF5bWVudCkgfHxcbiAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcbiAgICAgICAgVHlwZUVycm9yLFxuICAgICAgKTtcbiAgICBhc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbiAgICBjb25zdCBzcmNQYXltZW50QmFsYW5jZSA9IHBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuICAgIGFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKTtcbiAgICB0cnkge1xuICAgICAgLyogQ09NTUlUIFBPSU5UKi9cbiAgICAgIC8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuICAgICAgLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuICAgICAgZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbiAgICAgIGJhbGFuY2VTdG9yZS5pbmNyZW1lbnQoc3JjUGF5bWVudEJhbGFuY2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gIH07XG5cbiAgLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50U3RvcmV9IGJhbGFuY2VTdG9yZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSBbcmVjb3ZlcnlTZXRdXG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuICBjb25zdCB3aXRoZHJhd0ludGVybmFsID0gKGJhbGFuY2VTdG9yZSwgYW1vdW50LCByZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFtb3VudCA9IGNvZXJjZShhbW91bnQpO1xuICAgIGNvbnN0IHBheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgIC8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbiAgICAvKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG4gICAgYmFsYW5jZVN0b3JlLmRlY3JlbWVudChhbW91bnQpIHx8XG4gICAgICBGYWlsYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2JhbGFuY2VTdG9yZS5nZXRBbW91bnQoKX1gO1xuICAgIHRyeSB7XG4gICAgICBpbml0UGF5bWVudChwYXltZW50LCBhbW91bnQsIHJlY292ZXJ5U2V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHBheW1lbnQ7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsoKSA9PiBQdXJzZTxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggYW1vdW50IGtpbmRzKi9cbiAgY29uc3QgbWFrZUVtcHR5UHVyc2UgPSBwcmVwYXJlUHVyc2VLaW5kKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgYnJhbmQsXG4gICAgUHVyc2VJS2l0LFxuICAgIGhhcmRlbih7XG4gICAgICBkZXBvc2l0SW50ZXJuYWwsXG4gICAgICB3aXRoZHJhd0ludGVybmFsLFxuICAgIH0pLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIHBheW1lbnRSZWNvdmVyeVNldHMsXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtJc3N1ZXI8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbiAgY29uc3QgaXNzdWVyID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gaXNzdWVyYCwgSXNzdWVySSwge1xuICAgIGdldEJyYW5kKCkge1xuICAgICAgcmV0dXJuIGJyYW5kO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGdldEFzc2V0S2luZCgpIHtcbiAgICAgIHJldHVybiBhc3NldEtpbmQ7XG4gICAgfSxcbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIG1ha2VFbXB0eVB1cnNlKCkge1xuICAgICAgcmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbiAgICBpc0xpdmUocGF5bWVudCkge1xuICAgICAgLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgcmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG4gICAgZ2V0QW1vdW50T2YocGF5bWVudCkge1xuICAgICAgLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG4gICAgICByZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IG9wdEFtb3VudFNoYXBlXG4gKi9cbiAgICBidXJuKHBheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvKiBDT01NSVQgUE9JTlQuKi9cbiAgICAgICAgZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXltZW50QmFsYW5jZTtcbiAgICB9LFxuICB9KTtcblxuICAvKipcbiAqIFByb3ZpZGVzIGZvciB0aGUgcmVjb3Zlcnkgb2YgbmV3bHkgbWludGVkIGJ1dCBub3QteWV0LWRlcG9zaXRlZCBwYXltZW50cy5cbiAqXG4gKiBCZWNhdXNlIHRoZSBgbWludFJlY292ZXJ5UHVyc2VgIGlzIHBsYWNlZCBpbiBiYWdnYWdlLCBldmVuIGlmIHRoZSBjYWxsZXIgb2ZcbiAqIGBtYWtlSXNzdWVyS2l0YCBkcm9wcyBpdCBvbiB0aGUgZmxvb3IsIGl0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gYW5cbiAqIGVtZXJnZW5jeSB1cGdyYWRlLlxuICovXG4gIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlID0gLyoqIEB0eXBlIHtQdXJzZTxLPn0gKi8gKFxuICAgIGlzc3VlclpvbmUubWFrZU9uY2UoJ21pbnRSZWNvdmVyeVB1cnNlJywgKCkgPT4gbWFrZUVtcHR5UHVyc2UoKSlcbiAgKTtcblxuICAvKiogQHR5cGUge01pbnQ8Sz59ICovXG4gIGNvbnN0IG1pbnQgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBtaW50YCwgTWludEksIHtcbiAgICBnZXRJc3N1ZXIoKSB7XG4gICAgICByZXR1cm4gaXNzdWVyO1xuICAgIH0sXG4gICAgbWludFBheW1lbnQobmV3QW1vdW50KSB7XG4gICAgICBuZXdBbW91bnQgPSBjb2VyY2UobmV3QW1vdW50KTtcbiAgICAgIG11c3RNYXRjaChuZXdBbW91bnQsIGFtb3VudFNoYXBlLCAnbWludGVkIGFtb3VudCcpO1xuICAgICAgLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbiAgICAgIC8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuICAgICAgY29uc3QgcmF3UGF5bWVudCA9IG1ha2VQYXltZW50KCk7XG4gICAgICBpbml0UGF5bWVudChyYXdQYXltZW50LCBuZXdBbW91bnQsIHVuZGVmaW5lZCk7XG5cbiAgICAgIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgbWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LCBuZXdBbW91bnQpO1xuICAgICAgY29uc3QgcGF5bWVudCA9IG1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgYXNzZXJ0KGtleUVRKG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlLCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG4gICAgICByZXR1cm4gcGF5bWVudDtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBpc3N1ZXJLaXQgPSBoYXJkZW4oeyBpc3N1ZXIsIG1pbnQsIGJyYW5kLCBtaW50UmVjb3ZlcnlQdXJzZSB9KTtcbiAgcmV0dXJuIGlzc3VlcktpdDtcbn07JGjNj19vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudExlZGdlciI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+IJ6JlxwAAJccAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiLi9hbW91bnRTdG9yZS5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE0sbWFrZUNvcHlTZXQsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQsbWFrZUFtb3VudFN0b3JlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRTdG9yZS5qc1wiLCBbW1wibWFrZUFtb3VudFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZUFtb3VudFN0b3JlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Fzc2V0S2luZCwgUmVjb3ZlcnlTZXRzT3B0aW9uLCBCcmFuZCwgUGF5bWVudH0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvem9uZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge1NldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG5jb25zdCBFTVBUWV9DT1BZX1NFVCA9IG1ha2VDb3B5U2V0KFtdKTtcblxuLyogVE9ETyBUeXBlIEludGVyZmFjZUd1YXJkIGJldHRlciB0aGFuIEludGVyZmFjZUd1YXJkPGFueT4qL1xuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHt7XG4gKiAgIHB1cnNlOiBJbnRlcmZhY2VHdWFyZDxhbnk+O1xuICogICBkZXBvc2l0RmFjZXQ6IEludGVyZmFjZUd1YXJkPGFueT47XG4gKiB9fSBQdXJzZUlLaXRcbiAqIEBwYXJhbSB7e1xuICogICBkZXBvc2l0SW50ZXJuYWw6IGFueTtcbiAqICAgd2l0aGRyYXdJbnRlcm5hbDogYW55O1xuICogfX0gcHVyc2VNZXRob2RzXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGVcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIFNldFN0b3JlPFBheW1lbnQ+Pn0gcGF5bWVudFJlY292ZXJ5U2V0c1xuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVB1cnNlS2luZCA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBicmFuZCxcbiAgUHVyc2VJS2l0LFxuICBwdXJzZU1ldGhvZHMsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBwYXltZW50UmVjb3ZlcnlTZXRzLFxuKSA9PiB7XG4gIGNvbnN0IGFtb3VudFNoYXBlID0gYnJhbmQuZ2V0QW1vdW50U2hhcGUoKTtcblxuICAvKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbiAgLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG4gIC8qIFRPRE8gcHJvcGFnYXRlIHpvbmlmeWluZyB0byBub3RpZmllcnMsIG1heWJlPyovXG4gIGNvbnN0IHsgcHJvdmlkZU5vdGlmaWVyLCB1cGRhdGU6IHVwZGF0ZUJhbGFuY2UgfSA9IG1ha2VUcmFuc2llbnROb3RpZmllcktpdCgpO1xuXG4gIC8qKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnaGFzUmVjb3ZlcnlTZXRzJ2AgKHRoZSBub3JtYWwgc3RhdGUpLCB0aGVuIGp1c3RcbiAqIHJldHVybiBgc3RhdGUucmVjb3ZlcnlTZXRgLlxuICpcbiAqIElmIGByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJ2AsIHJldHVybiBgdW5kZWZpbmVkYC4gQ2FsbGVyc1xuICogbXVzdCBiZSBhd2FyZSB0aGF0IHRoZSBgdW5kZWZpbmVkYCByZXR1cm4gaGFwcGVucyBpZmYgYHJlY292ZXJ5U2V0c1N0YXRlXG4gKiA9PT0gJ25vUmVjb3ZlcnlTZXRzJ2AsIGFuZCB0byBhdm9pZCBzdG9yaW5nIG9yIHJldHJpZXZpbmcgYW55dGhpbmcgZnJvbSB0aGVcbiAqIGFjdHVhbCByZWNvdmVyeSBzZXQuXG4gKlxuICogQHBhcmFtIHt7IHJlY292ZXJ5U2V0OiBTZXRTdG9yZTxQYXltZW50PiB9fSBzdGF0ZVxuICogQHJldHVybnMge1NldFN0b3JlPFBheW1lbnQ+IHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IG1heWJlUmVjb3ZlcnlTZXQgPSBzdGF0ZSA9PiB7XG4gICAgY29uc3QgeyByZWNvdmVyeVNldCB9ID0gc3RhdGU7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnaGFzUmVjb3ZlcnlTZXRzJykge1xuICAgICAgcmV0dXJuIHJlY292ZXJ5U2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyB8fFxuICAgICAgICBGYWlsYHJlY292ZXJTZXRzU3RhdGUgbXVzdCBiZSBub1JlY292ZXJ5U2V0cyBpZiBpdCBpc24ndCBoYXNSZWNvdmVyU2V0c2A7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBwYXltZW50UmVjb3ZlcnlTZXRzIG11c3QgYWx3YXlzIGJlIGRlZmluZWRgO1xuICAgICAgcmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgIEZhaWxgV2l0aCBub1JlY292ZXJ5U2V0cywgcmVjb3ZlcnlTZXQgbXVzdCBiZSBlbXB0eWA7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qIC0gVGhpcyBraW5kIGlzIGEgcGFpciBvZiBwdXJzZSBhbmQgZGVwb3NpdEZhY2V0IHRoYXQgaGF2ZSBhIDE6MSovXG4gIC8qIGNvcnJlc3BvbmRlbmNlLiovXG4gIC8qIC0gVGhleSBhcmUgdmlydHVhbGl6ZWQgdG9nZXRoZXIgdG8gc2hhcmUgYSBzaW5nbGUgc3RhdGUgcmVjb3JkLiovXG4gIC8qIC0gQW4gYWx0ZXJuYXRpdmUgZGVzaWduIGNvbnNpZGVyZWQgd2FzIHRvIGhhdmUgdGhpcyByZXR1cm4gYSBQdXJzZSBhbG9uZSovXG4gIC8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuICAvKiBpZGVudGl0eSBmb3IgdGhlIGZhY2V0IGFuZCBleGVyY2lzZXMgdGhlIG11bHRpLWZhY2V0ZWQgb2JqZWN0IHN0eWxlLiovXG4gIGNvbnN0IHsgZGVwb3NpdEludGVybmFsLCB3aXRoZHJhd0ludGVybmFsIH0gPSBwdXJzZU1ldGhvZHM7XG4gIGNvbnN0IG1ha2VQdXJzZUtpdCA9IGlzc3VlclpvbmUuZXhvQ2xhc3NLaXQoXG4gICAgYCR7bmFtZX0gUHVyc2VgLFxuICAgIFB1cnNlSUtpdCxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50QmFsYW5jZSA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuXG4gICAgICAvKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuICAgICAgY29uc3QgcmVjb3ZlcnlTZXQgPSBpc3N1ZXJab25lLmRldGFjaGVkKCkuc2V0U3RvcmUoJ3JlY292ZXJ5IHNldCcpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50QmFsYW5jZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgcHVyc2U6IHtcbiAgICAgICAgZGVwb3NpdChzcmNQYXltZW50LCBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4gICAgICAgICAgLyogU2VlIHRoZSBjb21tZW50cyBvbiBQdXJzZUkuZGVwb3NpdCBpbiB0eXBlR3VhcmRzLmpzKi9cbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2UgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIGRlcG9zaXQuKi9cbiAgICAgICAgICBjb25zdCBzcmNQYXltZW50QmFsYW5jZSA9IGRlcG9zaXRJbnRlcm5hbChcbiAgICAgICAgICAgIGJhbGFuY2VTdG9yZSxcbiAgICAgICAgICAgIHNyY1BheW1lbnQsXG4gICAgICAgICAgICBvcHRBbW91bnRTaGFwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUJhbGFuY2UocHVyc2UsIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG4gICAgICAgICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoZHJhdyhhbW91bnQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2UgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIC8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiB3aXRoZHJhdy4qL1xuICAgICAgICAgIGNvbnN0IHBheW1lbnQgPSB3aXRoZHJhd0ludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgb3B0UmVjb3ZlcnlTZXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCYWxhbmNlKHB1cnNlLCBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCkpO1xuICAgICAgICAgIHJldHVybiBwYXltZW50O1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICByZXR1cm4gYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEFsbGVnZWRCcmFuZCgpIHtcbiAgICAgICAgICByZXR1cm4gYnJhbmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RGVwb3NpdEZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0UmVjb3ZlcnlTZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGlmIChvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQ09QWV9TRVQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvcHRSZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuICAgICAgICB9LFxuICAgICAgICByZWNvdmVyQWxsKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBsZXQgYW1vdW50ID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDsgLyogZW1wdHkgYXQgdGhpcyB0aW1lKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBwYXltZW50IG9mIG9wdFJlY292ZXJ5U2V0LmtleXMoKSkge1xuICAgICAgICAgICAgLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4gICAgICAgICAgICAvKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBmYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICAgIGFtb3VudCA9IEFtb3VudE1hdGguYWRkKGFtb3VudCwgZGVsdGEsIGJyYW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0UmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbiAgICAgICAgICByZXR1cm4gYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlcG9zaXRGYWNldDoge1xuICAgICAgICByZWNlaXZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlOiBhbW91bnRTaGFwZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQ6IE0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpLFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuICByZXR1cm4gKCkgPT4gbWFrZVB1cnNlS2l0KCkucHVyc2U7XG59OyRozY9fb25jZS5wcmVwYXJlUHVyc2VLaW5kKHByZXBhcmVQdXJzZUtpbmQpO1xuaGFyZGVuKHByZXBhcmVQdXJzZUtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVB1cnNlS2luZCI6WyJwcmVwYXJlUHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGDkrFsZBwAAGQcAAC0AAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL25vdGlmaWVyIl0sImV4cG9ydHMiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsWyRozY9fYSA9PiAocHJvdmlkZUxhenkgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UHVyc2V9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7Tm90aWZpZXJSZWNvcmR9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuICAgICAgIGNvbnN0IG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuICBjb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cyA9IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoXG4gICAgJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyxcbiAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXJLaXQgPSBrZXkgPT5cbiAgICBwcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cywga2V5LCAoKSA9PlxuICAgICAgbWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpLFxuICAgICk7XG5cbiAgY29uc3QgcHJvdmlkZU5vdGlmaWVyID0ga2V5ID0+IHByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuICBjb25zdCB1cGRhdGUgPSAoa2V5LCBuZXdWYWx1ZSkgPT4ge1xuICAgIGlmICh0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSkge1xuICAgICAgY29uc3QgeyB1cGRhdGVyIH0gPSB0cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbiAgICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4geyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZSB9O1xufTskaM2PX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFuc2llbnROb3RpZmllcktpdCI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5frfq0AtAABALQAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQW1vdW50UGF0dGVyblNoYXBlIiwiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLG1hdGNoZXMsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbW91bnRWYWx1ZSwgUmF0aW99IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBDb3B5U2V0LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtOYXRWYWx1ZSwgU2V0VmFsdWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbiAgICAgICBjb25zdCBCcmFuZFNoYXBlID0gTS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjNj19vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnSXNzdWVyJyk7JGjNj19vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbiAgICAgICBjb25zdCBQYXltZW50U2hhcGUgPSBNLnJlbW90YWJsZSgnUGF5bWVudCcpOyRozY9fb25jZS5QYXltZW50U2hhcGUoUGF5bWVudFNoYXBlKTtcbiAgICAgICBjb25zdCBQdXJzZVNoYXBlID0gTS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjNj19vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG4gICAgICAgY29uc3QgRGVwb3NpdEZhY2V0U2hhcGUgPSBNLnJlbW90YWJsZSgnRGVwb3NpdEZhY2V0Jyk7JGjNj19vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbiAgICAgICBjb25zdCBOb3RpZmllclNoYXBlID0gTS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7JGjNj19vbmNlLk5vdGlmaWVyU2hhcGUoTm90aWZpZXJTaGFwZSk7XG4gICAgICAgY29uc3QgTWludFNoYXBlID0gTS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgTmF0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpcyBhXG4gKiBub24tbmVnYXRpdmUgYmlnaW50LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhhdCBtYW55IHVuaXRzIG9mIHRoZSBmdW5naWJsZSBhc3NldFxuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQuIFRoZSBicmFuZCBvZiB0aGF0IGFtb3VudCBzaG91bGQgaW5kZWVkIHJlcHJlc2VudFxuICogYSBraW5kIG9mIGFzc2V0IGNvbnNpc3Rpbmcgb2YgYSBjb3VudGFibGUgc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjNj19vbmNlLk1pbnRTaGFwZShNaW50U2hhcGUpO1xuY29uc3QgTmF0VmFsdWVTaGFwZSA9IE0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2gga2V5XG4gKiByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGUgaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZVxuICogbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnRcbiAqIGl0c2VsZiByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlclxuICogaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZSA9IE0uc2V0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIFNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXMgYVxuICogQ29weUFycmF5IG9mIHBhc3NhYmxlIEtleXMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgZGVwcmVjYXRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqICAgQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmtleSgpKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weUJhZ1ZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUJhZywgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBiYWcgKG11bHRpc2V0KSBvZiB0aG9zZSBrZXlzLCB3aGVyZSBlYWNoXG4gKiBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgc2VtaS1mdW5naWJsZSBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsXG4gKiBmcm9tIHRoZSBzZW1pLWZ1bmdpYmxlIGFzc2V0IGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZVxuICogbnVtYmVyIG9mIHRpbWVzIHRoYXQga2V5IGFwcGVhcnMgaW4gdGhlIGJhZyBpcyB0aGUgbnVtYmVyIG9mIGZ1bmdpYmxlIHVuaXRzXG4gKiBvZiB0aGF0IGtleS4gVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50cyB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkXG4gKiB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZSB0aGF0IHdlXG4gKiBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdCB0aGUgY29kZSB0aGF0IGhvbGRzXG4gKiB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgYnJhbmQsIG9ubHlcbiAqIG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHMgb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5XG4gKiBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlciBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleVxuICogXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0IHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZVxuICogc2F0aXNmaWVkLiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weUJhZ1ZhbHVlU2hhcGUgPSBNLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlID0gTS5vcihcbiAgTmF0VmFsdWVTaGFwZSxcbiAgQ29weVNldFZhbHVlU2hhcGUsXG4gIFNldFZhbHVlU2hhcGUsXG4gIENvcHlCYWdWYWx1ZVNoYXBlLFxuKTtcblxuICAgICAgIGNvbnN0IEFtb3VudFNoYXBlID0geyBicmFuZDogQnJhbmRTaGFwZSwgdmFsdWU6IEFtb3VudFZhbHVlU2hhcGUgfTskaM2PX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuaGFyZGVuKEFtb3VudFNoYXBlKTtcblxuLyoqXG4gKiBUbyBiZSB1c2VkIHRvIGd1YXJkIGFuIGFtb3VudCBwYXR0ZXJuIGFyZ3VtZW50LCBpLmUuLCBhbiBhcmd1bWVudCB3aGljaCBpcyBhXG4gKiBwYXR0ZXJuIHRoYXQgY2FuIGJlIHVzZWQgdG8gdGVzdCBhbW91bnRzLiBTaW5jZSBhbW91bnRzIGFyZSBrZXlzLCBhbnl3aGVyZSBhblxuICogYW1vdW50IHBhdHRlcm4gaXMgZXhwZWN0ZWQsIGFuIGFtb3VudCBjYW4gYmUgcHJvdmlkZWQgYW5kIHdpbGwgbWF0Y2ggb25seVxuICogdGhhdCBjb25jcmV0ZSBhbW91bnQsIGkuZS4sIGFtb3VudHMgdGhhdCBhcmUgYGtleUVRYCB0byB0aGF0IGFtb3VudC5cbiAqXG4gKiBUaGUgYEFtb3VudFNoYXBlYCBndWFyZCBhYm92ZSBpcyBhbiBhbW91bnQgcGF0dGVybi4gQnV0IG5vdCBhbGwgYW1vdW50XG4gKiBwYXR0ZXJucyBhcmUgbGlrZSBgQW1vdW50U2hhcGVgLiBGb3IgZXhhbXBsZSwgYE0uYW55KClgIGlzIGEgdmFsaWQgYW1vdW50XG4gKiBwYXR0ZXJuIHRoYXQgd2lsbCBhZG1pdCBhbnkgYW1vdW50LCBidXQgaXMgZG9lcyBub3QgcmVzZW1ibGUgdGhlXG4gKiBgQW1vdW50U2hhcGVgIHBhdHRlcm4gYWJvdmUuXG4gKi9cbiAgICAgICBjb25zdCBBbW91bnRQYXR0ZXJuU2hhcGUgPSBNLnBhdHRlcm4oKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48UmF0aW8+fSAqLyRozY9fb25jZS5BbW91bnRQYXR0ZXJuU2hhcGUoQW1vdW50UGF0dGVyblNoYXBlKTtcbiAgICAgICBjb25zdCBSYXRpb1NoYXBlID0geyBudW1lcmF0b3I6IEFtb3VudFNoYXBlLCBkZW5vbWluYXRvcjogQW1vdW50U2hhcGUgfTskaM2PX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmhhcmRlbihSYXRpb1NoYXBlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBOYXQgYmlnaW50LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgTmF0VmFsdWV9XG4gKi9cbiAgICAgICBjb25zdCBpc05hdFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgTmF0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzTmF0VmFsdWUoaXNOYXRWYWx1ZSk7XG5oYXJkZW4oaXNOYXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weVNldFxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weVNldH1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weVNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIHBhc3MgYnkgY29weSBhcnJheSBzdHJ1Y3R1cmUuIERvZXMgbm90IGNoZWNrIGZvclxuICogZHVwbGljYXRlcy4gVG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMsIHVzZSBzZXRNYXRoSGVscGVycy5jb2VyY2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiAgIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG4gICAgICAgY29uc3QgaXNTZXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIFNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlCYWdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlCYWd9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlCYWdWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIENvcHlCYWdWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLyogT25lIEdPT0dPTHRoIHNob3VsZCBiZSBlbm91Z2ggZGVjaW1hbCBwbGFjZXMgZm9yIGFueWJvZHkuKi9cbiAgICAgICBjb25zdCBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMgPSAxMDA7JGjNj19vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG4gICAgICAgY29uc3QgQXNzZXRLaW5kU2hhcGUgPSBNLm9yKCduYXQnLCAnc2V0JywgJ2NvcHlTZXQnLCAnY29weUJhZycpOyRozY9fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBEaXNwbGF5SW5mb1NoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge30sXG4gIHtcbiAgICBkZWNpbWFsUGxhY2VzOiBNLmFuZChcbiAgICAgIE0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICAgTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbiAgICApLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGUsXG4gIH0sXG4gIHtcbiAgICAvKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4gICAgLyogcHJvcGVydGllcyBiZXlvbmQgdGhvc2UgaW4gdGhlIGBiYXNlYCByZWNvcmQuKi9cbiAgfSxcbik7JGjNj19vbmNlLkRpc3BsYXlJbmZvU2hhcGUoRGlzcGxheUluZm9TaGFwZSk7XG5cbiAgICAgICBjb25zdCBJc3N1ZXJLaXRTaGFwZSA9IHtcbiAgYnJhbmQ6IEJyYW5kU2hhcGUsXG4gIG1pbnQ6IE1pbnRTaGFwZSxcbiAgbWludFJlY292ZXJ5UHVyc2U6IFB1cnNlU2hhcGUsXG4gIGlzc3VlcjogSXNzdWVyU2hhcGUsXG4gIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlLFxufTskaM2PX29uY2UuSXNzdWVyS2l0U2hhcGUoSXNzdWVyS2l0U2hhcGUpO1xuaGFyZGVuKElzc3VlcktpdFNoYXBlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEludGVyZmFjZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gICAgICAgY29uc3QgQnJhbmRJID0gTS5pbnRlcmZhY2UoJ0JyYW5kJywge1xuICBpc015SXNzdWVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgZ2V0QWxsZWdlZE5hbWU6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICBnZXRBbW91bnRTaGFwZTogTS5jYWxsKCkucmV0dXJucyhNLnBhdHRlcm4oKSksXG59KTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFticmFuZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYXNzZXRLaW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthbW91bnRTaGFwZV1cbiAqLyRozY9fb25jZS5CcmFuZEkoQnJhbmRJKTtcbiAgICAgICBjb25zdCBtYWtlSXNzdWVySW50ZXJmYWNlcyA9IChcbiAgYnJhbmRTaGFwZSA9IEJyYW5kU2hhcGUsXG4gIGFzc2V0S2luZFNoYXBlID0gQXNzZXRLaW5kU2hhcGUsXG4gIGFtb3VudFNoYXBlID0gQW1vdW50U2hhcGUsXG4pID0+IHtcbiAgY29uc3QgSXNzdWVySSA9IE0uaW50ZXJmYWNlKCdJc3N1ZXInLCB7XG4gICAgZ2V0QnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG4gICAgZ2V0QWxsZWdlZE5hbWU6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gICAgZ2V0QXNzZXRLaW5kOiBNLmNhbGwoKS5yZXR1cm5zKGFzc2V0S2luZFNoYXBlKSxcbiAgICBnZXREaXNwbGF5SW5mbzogTS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbiAgICBtYWtlRW1wdHlQdXJzZTogTS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuICAgIGlzTGl2ZTogTS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIGdldEFtb3VudE9mOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG4gICAgYnVybjogTS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpXG4gICAgICAub3B0aW9uYWwoQW1vdW50UGF0dGVyblNoYXBlKVxuICAgICAgLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBNaW50SSA9IE0uaW50ZXJmYWNlKCdNaW50Jywge1xuICAgIGdldElzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gICAgbWludFBheW1lbnQ6IE0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQYXltZW50SSA9IE0uaW50ZXJmYWNlKCdQYXltZW50Jywge1xuICAgIGdldEFsbGVnZWRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJID0gTS5pbnRlcmZhY2UoJ1B1cnNlJywge1xuICAgIGdldEFsbGVnZWRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRDdXJyZW50QW1vdW50OiBNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6IE0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4gICAgLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbiAgICAvKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuICAgIC8qIGNhbGxlcnMgd2l0aCBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgZGVwb3NpdGAgbWVzc2FnZXMgYXJlKi9cbiAgICAvKiBwcm9jZXNzZWQgd2l0aG91dCBmdXJ0aGVyIGRlbGF5IGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4qL1xuICAgIC8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuICAgIC8qIGJlIGEgcmVtb3RhYmxlLCBub3QgYSBwcm9taXNlLiovXG4gICAgLyogUHVyc2VJIG9ubHkgY2FsbHMgdGhpcyByYXcgbWV0aG9kIGFmdGVyIHZhbGlkYXRpbmcgdGhhdCovXG4gICAgLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbiAgICAvKiB0byB0aGlzIHJhdyBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIHJlbW90YWJsZSBpcyBhY3R1YWxseSovXG4gICAgLyogYSBsaXZlIHBheW1lbnQgb2YgdGhlIGNvcnJlY3QgYnJhbmQgd2l0aCBzdWZmaWNpZW50IGZ1bmRzLiovXG4gICAgZGVwb3NpdDogTS5jYWxsKFBheW1lbnRTaGFwZSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gICAgZ2V0RGVwb3NpdEZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKERlcG9zaXRGYWNldFNoYXBlKSxcbiAgICB3aXRoZHJhdzogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gICAgZ2V0UmVjb3ZlcnlTZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbiAgICByZWNvdmVyQWxsOiBNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgRGVwb3NpdEZhY2V0SSA9IE0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLCB7XG4gICAgcmVjZWl2ZTogZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFB1cnNlSSkubWV0aG9kR3VhcmRzLmRlcG9zaXQsXG4gIH0pO1xuXG4gIGNvbnN0IFB1cnNlSUtpdCA9IHtcbiAgICBwdXJzZTogUHVyc2VJLFxuICAgIGRlcG9zaXRGYWNldDogRGVwb3NpdEZhY2V0SSxcbiAgfTtcbiAgaGFyZGVuKFB1cnNlSUtpdCk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgSXNzdWVySSxcbiAgICBNaW50SSxcbiAgICBQYXltZW50SSxcbiAgICBQdXJzZUlLaXQsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuU2hhcGUiOlsiQW1vdW50UGF0dGVyblNoYXBlIl0sIlJhdGlvU2hhcGUiOlsiUmF0aW9TaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADfJfjiKSAAACkgAAArAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbW1pdHRlZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCIuL2VsZWN0b3JhdGVUb29scy5qcyIsIi4vcXVlc3Rpb24uanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3ZvdGVyS2l0LmpzIl0sImV4cG9ydHMiOlsibWV0YSIsInN0YXJ0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVN0b3JlZFB1Ymxpc2hLaXQsTSxFLFN0b3JhZ2VOb2RlU2hhcGUsd3JhcFJlbW90ZU1hcnNoYWxsZXIscHJlcGFyZUV4byxwcm92aWRlRHVyYWJsZU1hcFN0b3JlLEVtcHR5UHJvcG9zYWxTaGFwZSxnZXRPcGVuUXVlc3Rpb25zLGdldFBvc2VySW52aXRhdGlvbixnZXRRdWVzdGlvbixzdGFydENvdW50ZXIsUXVvcnVtUnVsZSxFbGVjdG9yYXRlQ3JlYXRvckksRWxlY3RvcmF0ZVB1YmxpY0kscHJlcGFyZVZvdGVyS2l0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZVN0b3JlZFB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlU3RvcmVkUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJTdG9yYWdlTm9kZVNoYXBlXCIsWyRozY9fYSA9PiAoU3RvcmFnZU5vZGVTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzXCIsIFtbXCJ3cmFwUmVtb3RlTWFyc2hhbGxlclwiLFskaM2PX2EgPT4gKHdyYXBSZW1vdGVNYXJzaGFsbGVyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG8gPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiRW1wdHlQcm9wb3NhbFNoYXBlXCIsWyRozY9fYSA9PiAoRW1wdHlQcm9wb3NhbFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi9lbGVjdG9yYXRlVG9vbHMuanNcIiwgW1tcImdldE9wZW5RdWVzdGlvbnNcIixbJGjNj19hID0+IChnZXRPcGVuUXVlc3Rpb25zID0gJGjNj19hKV1dLFtcImdldFBvc2VySW52aXRhdGlvblwiLFskaM2PX2EgPT4gKGdldFBvc2VySW52aXRhdGlvbiA9ICRozY9fYSldXSxbXCJnZXRRdWVzdGlvblwiLFskaM2PX2EgPT4gKGdldFF1ZXN0aW9uID0gJGjNj19hKV1dLFtcInN0YXJ0Q291bnRlclwiLFskaM2PX2EgPT4gKHN0YXJ0Q291bnRlciA9ICRozY9fYSldXV1dLFtcIi4vcXVlc3Rpb24uanNcIiwgW1tcIlF1b3J1bVJ1bGVcIixbJGjNj19hID0+IChRdW9ydW1SdWxlID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJFbGVjdG9yYXRlQ3JlYXRvcklcIixbJGjNj19hID0+IChFbGVjdG9yYXRlQ3JlYXRvckkgPSAkaM2PX2EpXV0sW1wiRWxlY3RvcmF0ZVB1YmxpY0lcIixbJGjNj19hID0+IChFbGVjdG9yYXRlUHVibGljSSA9ICRozY9fYSldXV1dLFtcIi4vdm90ZXJLaXQuanNcIiwgW1tcInByZXBhcmVWb3RlcktpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVWb3RlcktpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtIYW5kbGV9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge1JlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtTdG9yZWRQdWJsaXNoS2l0fSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEludml0YXRpb24sIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7RWxlY3RvcmF0ZUNyZWF0b3JGYWNldCwgQ29tbWl0dGVlRWxlY3RvcmF0ZVB1YmxpYywgUXVlc3Rpb25EZXRhaWxzLCBPdXRjb21lUmVjb3JkLCBBZGRRdWVzdGlvbn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge1F1ZXN0aW9uUmVjb3JkfSBmcm9tICcuL2VsZWN0b3JhdGVUb29scy5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZUNyZWF0b3JGYWNldCAmIHtcbiAqICAgZ2V0Vm90ZXJJbnZpdGF0aW9uczogKCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPHsgdm90ZXI6IHsgY2FzdEJhbGxvdEZvcihoYW5kbGU6IGFueSwgY2hvaWNlPzogYW55LCApOiB2b2lkfX0+PltdXG4gKiB9fSBDb21taXR0ZWVFbGVjdG9yYXRlQ3JlYXRvckZhY2V0XG4gKi9cblxuLyoqIEB0eXBlIHtDb250cmFjdE1ldGE8dHlwZW9mIHN0YXJ0Pn0gKi9cbiAgICAgICBjb25zdCBtZXRhID0ge1xuICBwcml2YXRlQXJnc1NoYXBlOiB7XG4gICAgc3RvcmFnZU5vZGU6IFN0b3JhZ2VOb2RlU2hhcGUsXG4gICAgbWFyc2hhbGxlcjogTS5yZW1vdGFibGUoJ01hcnNoYWxsZXInKSxcbiAgfSxcbiAgdXBncmFkYWJpbGl0eTogJ2NhblVwZ3JhZGUnLFxufTskaM2PX29uY2UubWV0YShtZXRhKTtcbmhhcmRlbihtZXRhKTtcblxuLyoqXG4gKiBFYWNoIENvbW1pdHRlZSAoYW4gRWxlY3RvcmF0ZSkgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgc2V0IG9mIHZvdGVycy4gVGhlXG4gKiBudW1iZXIgb2Ygdm90ZXJzIGlzIHZpc2libGUgaW4gdGhlIHRlcm1zLlxuICpcbiAqIFRoaXMgY29udHJhY3QgY3JlYXRlcyBhbiBlbGVjdG9yYXRlIHdob3NlIG1lbWJlcnNoaXAgaXMgbm90IHZpc2libGUgdG9cbiAqIG9ic2VydmVycy4gVGhlcmUgbWF5IGJlIHVzZXMgZm9yIHN1Y2ggYSBzdHJ1Y3R1cmUsIGJ1dCBpdCBpcyBub3QgYXBwcm9wcmlhdGVcbiAqIGZvciBlbGVjdGlvbnMgd2hlcmUgdGhlIHNldCBvZiB2b3RlcnMgbmVlZHMgdG8gYmUga25vd24sIHVubGVzcyB0aGUgY29udHJhY3RcbiAqIGlzIHVzZWQgaW4gYSB3YXkgdGhhdCBtYWtlcyB0aGUgZGlzdHJpYnV0aW9uIG9mIHZvdGVyIGZhY2V0cyB2aXNpYmxlLlxuICpcbiAqIEBwYXJhbSB7WkNGPHtcbiAqICAgY29tbWl0dGVlTmFtZTogc3RyaW5nLFxuICogICBjb21taXR0ZWVTaXplOiBudW1iZXIsXG4gKiB9Pn0gemNmXG4gKiBAcGFyYW0ge3sgc3RvcmFnZU5vZGU6IFJlbW90ZTxTdG9yYWdlTm9kZT4sIG1hcnNoYWxsZXI6IFJlbW90ZTxNYXJzaGFsbGVyPn19IHByaXZhdGVBcmdzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEByZXR1cm5zIHt7Y3JlYXRvckZhY2V0OiBDb21taXR0ZWVFbGVjdG9yYXRlQ3JlYXRvckZhY2V0LCBwdWJsaWNGYWNldDogQ29tbWl0dGVlRWxlY3RvcmF0ZVB1YmxpY319XG4gKi9cbiAgICAgICBjb25zdCBzdGFydCA9ICh6Y2YsIHByaXZhdGVBcmdzLCBiYWdnYWdlKSA9PiB7XG4gIC8qKiBAdHlwZSB7TWFwU3RvcmU8SGFuZGxlPCdRdWVzdGlvbic+LCBRdWVzdGlvblJlY29yZD59ICovXG4gIGNvbnN0IGFsbFF1ZXN0aW9ucyA9IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwgJ1F1ZXN0aW9uJyk7XG5cbiAgLyogQ1JVQ0lBTDogdm90ZUNhcCBjYXJyaWVzIHRoZSBhYmlsaXR5IHRvIGNhc3Qgdm90ZXMgZm9yIGFueSB2b3RlciBhdCovXG4gIC8qIGFueSB3ZWlnaHQuIEl0J3Mgd3JhcHBlZCBoZXJlIGFuZCBnaXZlbiB0byB0aGUgdm90ZXIuKi9cbiAgLyoqL1xuICAvKiBFbnN1cmUgdGhhdCB0aGUgdm90ZXIgY2FuJ3QgZ2V0IGFjY2VzcyB0byB0aGUgdW53cmFwcGVkIHZvdGVDYXAsIGFuZCovXG4gIC8qIGhhcyBubyBjb250cm9sIG92ZXIgdGhlIHZvdGVIYW5kbGUgb3Igd2VpZ2h0Ki9cbiAgLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPHR5cGVvZiBwcmVwYXJlVm90ZXJLaXQ+WzFdWydzdWJtaXRWb3RlJ119ICovXG4gIGNvbnN0IHN1Ym1pdFZvdGUgPSAocXVlc3Rpb25IYW5kbGUsIHZvdGVySGFuZGxlLCBwb3NpdGlvbnMsIHdlaWdodCkgPT4ge1xuICAgIGNvbnN0IHsgdm90ZUNhcCB9ID0gYWxsUXVlc3Rpb25zLmdldChxdWVzdGlvbkhhbmRsZSk7XG4gICAgcmV0dXJuIEUodm90ZUNhcCkuc3VibWl0Vm90ZSh2b3RlckhhbmRsZSwgcG9zaXRpb25zLCB3ZWlnaHQpO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VWb3RlcktpdCA9IHByZXBhcmVWb3RlcktpdChiYWdnYWdlLCB7IHpjZiwgc3VibWl0Vm90ZSB9KTtcblxuICBjb25zdCBxdWVzdGlvbk5vZGUgPSBFKHByaXZhdGVBcmdzLnN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKFxuICAgICdsYXRlc3RRdWVzdGlvbicsXG4gICk7XG5cbiAgY29uc3QgeyBtYXJzaGFsbGVyOiByZW1vdGVNYXJzaGFsbGVyIH0gPSBwcml2YXRlQXJncztcblxuICBjb25zdCBjYWNoaW5nTWFyc2hhbGxlciA9IHdyYXBSZW1vdGVNYXJzaGFsbGVyKHJlbW90ZU1hcnNoYWxsZXIpO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVkUHVibGlzaEtpdDxRdWVzdGlvbkRldGFpbHM+fSAqL1xuICBjb25zdCB7IHN1YnNjcmliZXI6IHF1ZXN0aW9uc1N1YnNjcmliZXIsIHB1Ymxpc2hlcjogcXVlc3Rpb25zUHVibGlzaGVyIH0gPVxuICAgIG1ha2VTdG9yZWRQdWJsaXNoS2l0KHF1ZXN0aW9uTm9kZSwgY2FjaGluZ01hcnNoYWxsZXIpO1xuXG4gIGNvbnN0IG1ha2VDb21taXR0ZWVWb3Rlckludml0YXRpb24gPSBpbmRleCA9PiB7XG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzQ0OC9maWxlcyNyNzA0MDAzNjEyKi9cbiAgICAvKiBUaGlzIHdpbGwgcHJvZHVjZSB1bmlxdWUgZGVzY3JpcHRpb25zIGJlY2F1c2UqL1xuICAgIC8qIG1ha2VDb21taXR0ZWVWb3Rlckludml0YXRpb24oKSBpcyBvbmx5IGNhbGxlZCB3aXRoaW4gdGhlIGZvbGxvd2luZyBsb29wLCovXG4gICAgLyogd2hpY2ggaXMgb25seSBjYWxsZWQgb25jZSBwZXIgRWxlY3RvcmF0ZS4qL1xuICAgIHJldHVybiB6Y2YubWFrZUludml0YXRpb24oXG4gICAgICBzZWF0ID0+IHtcbiAgICAgICAgc2VhdC5leGl0KCk7XG4gICAgICAgIHJldHVybiBtYWtlVm90ZXJLaXQoaW5kZXgpO1xuICAgICAgfSxcbiAgICAgIGBWb3RlciR7aW5kZXh9YCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIEVtcHR5UHJvcG9zYWxTaGFwZSxcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHsgY29tbWl0dGVlTmFtZSwgY29tbWl0dGVlU2l6ZSB9ID0gemNmLmdldFRlcm1zKCk7XG5cbiAgY29uc3QgaW52aXRhdGlvbnMgPSBoYXJkZW4oXG4gICAgWy4uLkFycmF5KGNvbW1pdHRlZVNpemUpLmtleXMoKV0ubWFwKG1ha2VDb21taXR0ZWVWb3Rlckludml0YXRpb24pLFxuICApO1xuXG4gIGNvbnN0IHB1YmxpY0ZhY2V0ID0gcHJlcGFyZUV4byhcbiAgICBiYWdnYWdlLFxuICAgICdDb21taXR0ZWUgcHVibGljRmFjZXQnLFxuICAgIEVsZWN0b3JhdGVQdWJsaWNJLFxuICAgIHtcbiAgICAgIGdldFF1ZXN0aW9uU3Vic2NyaWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uc1N1YnNjcmliZXI7XG4gICAgICB9LFxuICAgICAgZ2V0T3BlblF1ZXN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIGdldE9wZW5RdWVzdGlvbnMoYWxsUXVlc3Rpb25zKTtcbiAgICAgIH0sXG4gICAgICBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gY29tbWl0dGVlTmFtZTtcbiAgICAgIH0sXG4gICAgICBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHpjZi5nZXRJbnN0YW5jZSgpO1xuICAgICAgfSxcbiAgICAgIGdldFF1ZXN0aW9uKGhhbmRsZVApIHtcbiAgICAgICAgcmV0dXJuIGdldFF1ZXN0aW9uKGhhbmRsZVAsIGFsbFF1ZXN0aW9ucyk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgY3JlYXRvckZhY2V0ID0gcHJlcGFyZUV4byhcbiAgICBiYWdnYWdlLFxuICAgICdDb21taXR0ZWUgY3JlYXRvckZhY2V0JyxcbiAgICBFbGVjdG9yYXRlQ3JlYXRvckksXG4gICAge1xuICAgICAgZ2V0UG9zZXJJbnZpdGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gZ2V0UG9zZXJJbnZpdGF0aW9uKHpjZiwgYXN5bmMgKHZvdGVDb3VudGVyLCBxdWVzdGlvblNwZWMpID0+XG4gICAgICAgICAgY3JlYXRvckZhY2V0LmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVyLCBxdWVzdGlvblNwZWMpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIC8qKiBAdHlwZSB7QWRkUXVlc3Rpb259ICovXG4gICAgICBhc3luYyBhZGRRdWVzdGlvbih2b3RlQ291bnRlciwgcXVlc3Rpb25TcGVjKSB7XG4gICAgICAgIGNvbnN0IHF1b3J1bVRocmVzaG9sZCA9IHF1b3J1bVJ1bGUgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocXVvcnVtUnVsZSkge1xuICAgICAgICAgICAgY2FzZSBRdW9ydW1SdWxlLk1BSk9SSVRZOlxuICAgICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKChjb21taXR0ZWVTaXplICsgMSkgLyAyKTtcbiAgICAgICAgICAgIGNhc2UgUXVvcnVtUnVsZS5BTEw6XG4gICAgICAgICAgICAgIHJldHVybiBjb21taXR0ZWVTaXplO1xuICAgICAgICAgICAgY2FzZSBRdW9ydW1SdWxlLk5PX1FVT1JVTTpcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgJHtxdW9ydW1SdWxlfSBpcyBub3QgYSByZWNvZ25pemVkIHF1b3J1bSBydWxlYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG91dGNvbWVOb2RlID0gRShwcml2YXRlQXJncy5zdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShcbiAgICAgICAgICAnbGF0ZXN0T3V0Y29tZScsXG4gICAgICAgICk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHtTdG9yZWRQdWJsaXNoS2l0PE91dGNvbWVSZWNvcmQ+fSAqL1xuICAgICAgICBjb25zdCB7IHB1Ymxpc2hlcjogb3V0Y29tZVB1Ymxpc2hlciB9ID0gbWFrZVN0b3JlZFB1Ymxpc2hLaXQoXG4gICAgICAgICAgb3V0Y29tZU5vZGUsXG4gICAgICAgICAgY2FjaGluZ01hcnNoYWxsZXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHN0YXJ0Q291bnRlcihcbiAgICAgICAgICB6Y2YsXG4gICAgICAgICAgcXVlc3Rpb25TcGVjLFxuICAgICAgICAgIHF1b3J1bVRocmVzaG9sZChxdWVzdGlvblNwZWMucXVvcnVtUnVsZSksXG4gICAgICAgICAgdm90ZUNvdW50ZXIsXG4gICAgICAgICAgYWxsUXVlc3Rpb25zLFxuICAgICAgICAgIHF1ZXN0aW9uc1B1Ymxpc2hlcixcbiAgICAgICAgICBvdXRjb21lUHVibGlzaGVyLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGdldFZvdGVySW52aXRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBpbnZpdGF0aW9ucztcbiAgICAgIH0sXG4gICAgICBnZXRRdWVzdGlvblN1YnNjcmliZXIoKSB7XG4gICAgICAgIHJldHVybiBxdWVzdGlvbnNTdWJzY3JpYmVyO1xuICAgICAgfSxcblxuICAgICAgZ2V0UHVibGljRmFjZXQoKSB7XG4gICAgICAgIHJldHVybiBwdWJsaWNGYWNldDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICByZXR1cm4geyBwdWJsaWNGYWNldCwgY3JlYXRvckZhY2V0IH07XG59OyRozY9fb25jZS5zdGFydChzdGFydCk7XG5oYXJkZW4oc3RhcnQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWV0YSI6WyJtZXRhIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADywRDtREgAAURIAADEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvZWxlY3RvcmF0ZVRvb2xzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJnZXRPcGVuUXVlc3Rpb25zIiwiZ2V0UG9zZXJJbnZpdGF0aW9uIiwiZ2V0UXVlc3Rpb24iLCJzdGFydENvdW50ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFbXB0eVByb3Bvc2FsU2hhcGUsRSxkZWVwbHlGdWxmaWxsZWQsRmFyOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkVtcHR5UHJvcG9zYWxTaGFwZVwiLFskaM2PX2EgPT4gKEVtcHR5UHJvcG9zYWxTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0hhbmRsZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1B1Ymxpc2hlcn0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQsIFZvdGVDb3VudGVyUHVibGljRmFjZXQsIFF1ZXN0aW9uU3BlYywgT3V0Y29tZVJlY29yZCwgQWRkUXVlc3Rpb24sIEFkZFF1ZXN0aW9uUmV0dXJufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1RpbWVzdGFtcH0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uUmVjb3JkXG4gKiBAcHJvcGVydHkge0VSZWY8Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQ+fSB2b3RlQ2FwXG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge1RpbWVzdGFtcH0gZGVhZGxpbmVcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHVwIGEgbmV3IENvdW50ZXIgZm9yIGEgcXVlc3Rpb25cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge3Vua25vd259IHF1b3J1bVRocmVzaG9sZFxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IHZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge01hcFN0b3JlPEhhbmRsZTwnUXVlc3Rpb24nPiwgUXVlc3Rpb25SZWNvcmQ+fSBxdWVzdGlvblN0b3JlXG4gKiBAcGFyYW0ge1B1Ymxpc2hlcjx1bmtub3duPn0gcXVlc3Rpb25zUHVibGlzaGVyXG4gKiBAcGFyYW0ge1B1Ymxpc2hlcjxPdXRjb21lUmVjb3JkPn0gb3V0Y29tZVB1Ymxpc2hlclxuICogQHJldHVybnMge1Byb21pc2U8QWRkUXVlc3Rpb25SZXR1cm4+fVxuICovXG5jb25zdCBzdGFydENvdW50ZXIgPSBhc3luYyAoXG4gIHpjZixcbiAgcXVlc3Rpb25TcGVjLFxuICBxdW9ydW1UaHJlc2hvbGQsXG4gIHZvdGVDb3VudGVyLFxuICBxdWVzdGlvblN0b3JlLFxuICBxdWVzdGlvbnNQdWJsaXNoZXIsXG4gIG91dGNvbWVQdWJsaXNoZXIsXG4pID0+IHtcbiAgY29uc3Qgdm90ZUNvdW50ZXJUZXJtcyA9IHtcbiAgICBxdWVzdGlvblNwZWMsXG4gICAgZWxlY3RvcmF0ZTogemNmLmdldEluc3RhbmNlKCksXG4gICAgcXVvcnVtVGhyZXNob2xkLFxuICB9O1xuXG4gIGNvbnN0IHsgZGVhZGxpbmUgfSA9IHF1ZXN0aW9uU3BlYy5jbG9zaW5nUnVsZTtcbiAgLyogZmFjZXRzIG9mIHRoZSB2b3RlQ291bnRlci4gY3JlYXRvckludml0YXRpb24gYW5kIGFkbWluRmFjZXQgbm90IHVzZWQqL1xuICAvKiogQHR5cGUge3sgY3JlYXRvckZhY2V0OiBWb3RlQ291bnRlckNyZWF0b3JGYWNldCwgcHVibGljRmFjZXQ6IFZvdGVDb3VudGVyUHVibGljRmFjZXQsIGluc3RhbmNlOiBJbnN0YW5jZSB9fSAqL1xuICBjb25zdCB7IGNyZWF0b3JGYWNldCwgcHVibGljRmFjZXQsIGluc3RhbmNlIH0gPSBhd2FpdCBFKFxuICAgIHpjZi5nZXRab2VTZXJ2aWNlKCksXG4gICkuc3RhcnRJbnN0YW5jZShcbiAgICB2b3RlQ291bnRlcixcbiAgICB7fSxcbiAgICB2b3RlQ291bnRlclRlcm1zLFxuICAgIHsgb3V0Y29tZVB1Ymxpc2hlciB9LFxuICAgIGB2b3RlQ291bnRlci4ke2RlYWRsaW5lfWAsXG4gICk7XG4gIGNvbnN0IGRldGFpbHMgPSBhd2FpdCBFKHB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCk7XG4gIHF1ZXN0aW9uc1B1Ymxpc2hlci5wdWJsaXNoKGRldGFpbHMpO1xuICBjb25zdCBxdWVzdGlvbkhhbmRsZSA9IGRldGFpbHMucXVlc3Rpb25IYW5kbGU7XG5cbiAgY29uc3Qgdm90ZUNvdW50ZXJGYWNldHMgPSB7IHZvdGVDYXA6IGNyZWF0b3JGYWNldCwgcHVibGljRmFjZXQsIGRlYWRsaW5lIH07XG5cbiAgcXVlc3Rpb25TdG9yZS5pbml0KHF1ZXN0aW9uSGFuZGxlLCBoYXJkZW4odm90ZUNvdW50ZXJGYWNldHMpKTtcblxuICByZXR1cm4geyBjcmVhdG9yRmFjZXQsIHB1YmxpY0ZhY2V0LCBpbnN0YW5jZSwgZGVhZGxpbmUsIHF1ZXN0aW9uSGFuZGxlIH07XG59O1xuXG4vKiogQHBhcmFtIHtNYXBTdG9yZTxIYW5kbGU8J1F1ZXN0aW9uJz4sIFF1ZXN0aW9uUmVjb3JkPn0gcXVlc3Rpb25TdG9yZSAqLyRozY9fb25jZS5zdGFydENvdW50ZXIoc3RhcnRDb3VudGVyKTtcbmNvbnN0IGdldE9wZW5RdWVzdGlvbnMgPSBhc3luYyBxdWVzdGlvblN0b3JlID0+IHtcbiAgLyoqIEB0eXBlIHtbUHJvbWlzZTxib29sZWFuPiwgSGFuZGxlPCdRdWVzdGlvbic+XVtdfSAqL1xuICBjb25zdCBpc09wZW5QUXVlc3Rpb25zID0gWy4uLnF1ZXN0aW9uU3RvcmUuZW50cmllcygpXS5tYXAoXG4gICAgKFtrZXksIHsgcHVibGljRmFjZXQgfV0pID0+IHtcbiAgICAgIHJldHVybiBbRShwdWJsaWNGYWNldCkuaXNPcGVuKCksIGtleV07XG4gICAgfSxcbiAgKTtcblxuICAvKiogQHR5cGUge1tib29sZWFuLCBIYW5kbGU8J1F1ZXN0aW9uJz5dW119ICovXG4gIGNvbnN0IGlzT3BlblF1ZXN0aW9ucyA9IGF3YWl0IGRlZXBseUZ1bGZpbGxlZChoYXJkZW4oaXNPcGVuUFF1ZXN0aW9ucykpO1xuICByZXR1cm4gaXNPcGVuUXVlc3Rpb25zXG4gICAgLmZpbHRlcigoW29wZW4sIF9rZXldKSA9PiBvcGVuKVxuICAgIC5tYXAoKFtfb3Blbiwga2V5XSkgPT4ga2V5KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFUmVmPEhhbmRsZTwnUXVlc3Rpb24nPj59IHF1ZXN0aW9uSGFuZGxlUFxuICogQHBhcmFtIHtNYXBTdG9yZTxIYW5kbGU8J1F1ZXN0aW9uJz4sIFF1ZXN0aW9uUmVjb3JkPn0gcXVlc3Rpb25TdG9yZVxuICovJGjNj19vbmNlLmdldE9wZW5RdWVzdGlvbnMoZ2V0T3BlblF1ZXN0aW9ucyk7XG5jb25zdCBnZXRRdWVzdGlvbiA9IChxdWVzdGlvbkhhbmRsZVAsIHF1ZXN0aW9uU3RvcmUpID0+XG4gIEUud2hlbihxdWVzdGlvbkhhbmRsZVAsIHF1ZXN0aW9uSGFuZGxlID0+XG4gICAgRShxdWVzdGlvblN0b3JlLmdldChxdWVzdGlvbkhhbmRsZSkucHVibGljRmFjZXQpLmdldFF1ZXN0aW9uKCksXG4gICk7XG5cbi8qKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtBZGRRdWVzdGlvbn0gYWRkUXVlc3Rpb25cbiAqLyRozY9fb25jZS5nZXRRdWVzdGlvbihnZXRRdWVzdGlvbik7XG5jb25zdCBnZXRQb3Nlckludml0YXRpb24gPSAoemNmLCBhZGRRdWVzdGlvbikgPT4ge1xuICBjb25zdCBxdWVzdGlvblBvc2VySGFuZGxlciA9IHNlYXQgPT4ge1xuICAgIHNlYXQuZXhpdCgpO1xuICAgIHJldHVybiBGYXIoYHF1ZXN0aW9uUG9zZXJgLCB7IGFkZFF1ZXN0aW9uIH0pO1xuICB9O1xuICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKFxuICAgIHF1ZXN0aW9uUG9zZXJIYW5kbGVyLFxuICAgIGBxdWVzdGlvblBvc2VyYCxcbiAgICB1bmRlZmluZWQsXG4gICAgRW1wdHlQcm9wb3NhbFNoYXBlLFxuICApO1xufTskaM2PX29uY2UuZ2V0UG9zZXJJbnZpdGF0aW9uKGdldFBvc2VySW52aXRhdGlvbik7XG5cbmhhcmRlbihzdGFydENvdW50ZXIpO1xuaGFyZGVuKGdldE9wZW5RdWVzdGlvbnMpO1xuaGFyZGVuKGdldFF1ZXN0aW9uKTtcbmhhcmRlbihnZXRQb3Nlckludml0YXRpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RhcnRDb3VudGVyIjpbInN0YXJ0Q291bnRlciJdLCJnZXRPcGVuUXVlc3Rpb25zIjpbImdldE9wZW5RdWVzdGlvbnMiXSwiZ2V0UXVlc3Rpb24iOlsiZ2V0UXVlc3Rpb24iXSwiZ2V0UG9zZXJJbnZpdGF0aW9uIjpbImdldFBvc2VySW52aXRhdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3mGJdAxEAAAMRAAAqAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3F1ZXN0aW9uLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIkNob2ljZU1ldGhvZCIsIkVsZWN0aW9uVHlwZSIsIlF1b3J1bVJ1bGUiLCJidWlsZFF1ZXN0aW9uIiwiY29lcmNlUXVlc3Rpb25TcGVjIiwicG9zaXRpb25JbmNsdWRlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFeG8sbXVzdE1hdGNoLGtleUVRLE0sbWFrZUhhbmRsZSxRdWVzdGlvbkksUXVlc3Rpb25TcGVjU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzXCIsIFtbXCJtYWtlSGFuZGxlXCIsWyRozY9fYSA9PiAobWFrZUhhbmRsZSA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUXVlc3Rpb25JXCIsWyRozY9fYSA9PiAoUXVlc3Rpb25JID0gJGjNj19hKV1dLFtcIlF1ZXN0aW9uU3BlY1NoYXBlXCIsWyRozY9fYSA9PiAoUXVlc3Rpb25TcGVjU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0J1aWxkUXVlc3Rpb24sIFBvc2l0aW9uSW5jbHVkZWQsIFF1ZXN0aW9uLCBRdWVzdGlvblNwZWN9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qIFRvcGljcyBiZWluZyB2b3RlZCBvbiBhcmUgJ1F1ZXN0aW9ucycuIEJlZm9yZSBhIFF1ZXN0aW9uIGlzIGtub3duIHRvIGEqL1xuLyogZWxlY3RvcmF0ZSwgdGhlIHBhcmFtZXRlcnMgY2FuIGJlIGRlc2NyaWJlZCB3aXRoIGEgUXVlc3Rpb25TcGVjLiBPbmNlIHRoZSovXG4vKiBxdWVzdGlvbiBoYXMgYmVlbiBwcmVzZW50ZWQgdG8gYW4gRWxlY3RvcmF0ZSwgdGhlcmUgaXMgYSBRdWVzdGlvbkRldGFpbHMqL1xuLyogcmVjb3JkIHRoYXQgYWxzbyBpbmNsdWRlcyB0aGUgVm90ZUNvdW50ZXIgd2hpY2ggd2lsbCBkZXRlcm1pbmUgdGhlIG91dGNvbWUqL1xuLyogYW5kIHRoZSBxdWVzdGlvbkhhbmRsZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgaXQuKi9cblxuLyoqXG4gKiBcInVucmFua2VkXCIgaXMgbW9yZSBmb3JtYWxseSBrbm93biBhcyBcImFwcHJvdmFsXCIgdm90aW5nLCBidXQgdGhpcyBpcyBoYXJkIGZvclxuICogcGVvcGxlIHRvIGludHVpdCB3aGVuIHRoZXJlIGFyZSBvbmx5IHR3byBhbHRlcm5hdGl2ZXMuXG4gKi9cbmNvbnN0IENob2ljZU1ldGhvZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIFVOUkFOS0VEOiAndW5yYW5rZWQnLFxuICBPUkRFUjogJ29yZGVyJyxcbiAgUExVUkFMSVRZOiAncGx1cmFsaXR5Jyxcbn0pOyRozY9fb25jZS5DaG9pY2VNZXRob2QoQ2hvaWNlTWV0aG9kKTtcblxuY29uc3QgRWxlY3Rpb25UeXBlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgLyogQSBwYXJhbWV0ZXIgaXMgbmFtZWQsIGFuZCBhIG5ldyB2YWx1ZSBwcm9wb3NlZCovXG4gIFBBUkFNX0NIQU5HRTogJ3BhcmFtX2NoYW5nZScsXG4gIC8qIGNob29zZSBvbmUgb3IgbXVsdGlwbGUgd2lubmVycywgZGVwZW5kaW5nIG9uIENob2ljZU1ldGhvZCovXG4gIEVMRUNUSU9OOiAnZWxlY3Rpb24nLFxuICBTVVJWRVk6ICdzdXJ2ZXknLFxuICAvKiB3aGV0aGVyIG9yIG5vdCB0byBpbnZva2UgYW4gQVBJIG1ldGhvZCovXG4gIEFQSV9JTlZPQ0FUSU9OOiAnYXBpX2ludm9jYXRpb24nLFxuICBPRkZFUl9GSUxURVI6ICdvZmZlcl9maWx0ZXInLFxufSk7JGjNj19vbmNlLkVsZWN0aW9uVHlwZShFbGVjdGlvblR5cGUpO1xuXG5jb25zdCBRdW9ydW1SdWxlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgTUFKT1JJVFk6ICdtYWpvcml0eScsXG4gIE5PX1FVT1JVTTogJ25vX3F1b3J1bScsXG4gIC8qIFRoZSBlbGVjdGlvbiBpc24ndCB2YWxpZCB1bmxlc3MgYWxsIHZvdGVycyB2b3RlKi9cbiAgQUxMOiAnYWxsJyxcbn0pO1xuXG4vKiogQHR5cGUge1Bvc2l0aW9uSW5jbHVkZWR9ICovJGjNj19vbmNlLlF1b3J1bVJ1bGUoUXVvcnVtUnVsZSk7XG5jb25zdCBwb3NpdGlvbkluY2x1ZGVkID0gKHBvc2l0aW9ucywgcCkgPT4gcG9zaXRpb25zLnNvbWUoZSA9PiBrZXlFUShlLCBwKSk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gYWxsZWdlZFF1ZXN0aW9uU3BlY1xuICogQHJldHVybnMge1F1ZXN0aW9uU3BlY31cbiAqLyRozY9fb25jZS5wb3NpdGlvbkluY2x1ZGVkKHBvc2l0aW9uSW5jbHVkZWQpO1xuY29uc3QgY29lcmNlUXVlc3Rpb25TcGVjID0gKHtcbiAgbWV0aG9kLFxuICBpc3N1ZSxcbiAgcG9zaXRpb25zLFxuICBlbGVjdGlvblR5cGUsXG4gIG1heENob2ljZXMsXG4gIG1heFdpbm5lcnMsXG4gIGNsb3NpbmdSdWxlLFxuICBxdW9ydW1SdWxlLFxuICB0aWVPdXRjb21lLFxufSkgPT4ge1xuICBjb25zdCBxdWVzdGlvbiA9IGhhcmRlbih7XG4gICAgbWV0aG9kLFxuICAgIGlzc3VlLFxuICAgIHBvc2l0aW9ucyxcbiAgICBtYXhDaG9pY2VzOiBOdW1iZXIobWF4Q2hvaWNlcyksXG4gICAgbWF4V2lubmVyczogTnVtYmVyKG1heFdpbm5lcnMpLFxuICAgIGVsZWN0aW9uVHlwZSxcbiAgICBjbG9zaW5nUnVsZSxcbiAgICBxdW9ydW1SdWxlLFxuICAgIHRpZU91dGNvbWUsXG4gIH0pO1xuXG4gIG11c3RNYXRjaChxdWVzdGlvbiwgUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gIC8qIFhYWCBJdCB3b3VsZCBiZSBuaWNlIHRvIGVuZm9yY2UgdGhpcyB1c2luZyBwYXJhbWV0ZXJpemVkIHR5cGVzLCBidXQgdGhhdCovXG4gIC8qIHNlZW1zIHRvIG9ubHkgZW5mb3JjZSB0eXBlIGNvbnN0cmFpbnRzLCAoaS5lLiB0aGUgdGllT3V0Y29tZSB3aWxsIGJlIHRoZSovXG4gIC8qIHNhbWUgdHlwZSBhcyBhbnkgb2YgdGhlIHBvc2l0aW9ucykgdW5sZXNzIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29uY3JldGUqL1xuICAvKiB2YWx1ZSBhdCBwYXR0ZXJuIGNyZWF0aW9uIHRpbWUuKi9cbiAgbXVzdE1hdGNoKHF1ZXN0aW9uLnRpZU91dGNvbWUsIE0ub3IoLi4ucXVlc3Rpb24ucG9zaXRpb25zKSk7XG5cbiAgcmV0dXJuIHF1ZXN0aW9uO1xufTtcblxuLyoqIEB0eXBlIHtCdWlsZFF1ZXN0aW9ufSAqLyRozY9fb25jZS5jb2VyY2VRdWVzdGlvblNwZWMoY29lcmNlUXVlc3Rpb25TcGVjKTtcbmNvbnN0IGJ1aWxkUXVlc3Rpb24gPSAocXVlc3Rpb25TcGVjLCBjb3VudGVySW5zdGFuY2UpID0+IHtcbiAgY29uc3QgcXVlc3Rpb25IYW5kbGUgPSBtYWtlSGFuZGxlKCdRdWVzdGlvbicpO1xuXG4gIC8qKiBAdHlwZSB7UXVlc3Rpb259ICovXG4gIHJldHVybiBtYWtlRXhvKCdxdWVzdGlvbiBkZXRhaWxzJywgUXVlc3Rpb25JLCB7XG4gICAgZ2V0Vm90ZUNvdW50ZXIoKSB7XG4gICAgICByZXR1cm4gY291bnRlckluc3RhbmNlO1xuICAgIH0sXG4gICAgZ2V0RGV0YWlscygpIHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAuLi5xdWVzdGlvblNwZWMsXG4gICAgICAgIHF1ZXN0aW9uSGFuZGxlLFxuICAgICAgICBjb3VudGVySW5zdGFuY2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmJ1aWxkUXVlc3Rpb24oYnVpbGRRdWVzdGlvbik7XG5cbmhhcmRlbihidWlsZFF1ZXN0aW9uKTtcbmhhcmRlbihDaG9pY2VNZXRob2QpO1xuaGFyZGVuKEVsZWN0aW9uVHlwZSk7XG5oYXJkZW4oY29lcmNlUXVlc3Rpb25TcGVjKTtcbmhhcmRlbihwb3NpdGlvbkluY2x1ZGVkKTtcbmhhcmRlbihRdW9ydW1SdWxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNob2ljZU1ldGhvZCI6WyJDaG9pY2VNZXRob2QiXSwiRWxlY3Rpb25UeXBlIjpbIkVsZWN0aW9uVHlwZSJdLCJRdW9ydW1SdWxlIjpbIlF1b3J1bVJ1bGUiXSwicG9zaXRpb25JbmNsdWRlZCI6WyJwb3NpdGlvbkluY2x1ZGVkIl0sImNvZXJjZVF1ZXN0aW9uU3BlYyI6WyJjb2VyY2VRdWVzdGlvblNwZWMiXSwiYnVpbGRRdWVzdGlvbiI6WyJidWlsZFF1ZXN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJtAyG0sQAAALEAAACwAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL25vdGlmaWVyIl0sImV4cG9ydHMiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIiwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSIsIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSIsIkNob2ljZU1ldGhvZFNoYXBlIiwiQ2xvc2luZ1J1bGVTaGFwZSIsIkVsZWN0aW9uVHlwZVNoYXBlIiwiRWxlY3RvcmF0ZUNyZWF0b3JJIiwiRWxlY3RvcmF0ZVB1YmxpY0kiLCJHb3Zlcm5vckZhY2V0U2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIiwiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiLCJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiLCJPZmZlckZpbHRlcklzc3VlU2hhcGUiLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIiwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSIsIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiLCJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIiwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiLCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIiwiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIiwiUGFyYW1QYXRoU2hhcGUiLCJQb3NpdGlvblNoYXBlIiwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJRdWVzdGlvbkhhbmRsZVNoYXBlIiwiUXVlc3Rpb25JIiwiUXVlc3Rpb25TcGVjU2hhcGUiLCJRdWVzdGlvblN0YXRzU2hhcGUiLCJRdW9ydW1SdWxlU2hhcGUiLCJTaW1wbGVJc3N1ZVNoYXBlIiwiU2ltcGxlUG9zaXRpb25zU2hhcGUiLCJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIiwiVm90ZUNvdW50ZXJBZG1pbkkiLCJWb3RlQ291bnRlckNsb3NlSSIsIlZvdGVDb3VudGVyUHVibGljSSIsIlZvdGVySGFuZGxlIiwiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiLCJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiLCJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIiwiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sVGltZXN0YW1wU2hhcGUsSW5zdGFuY2VIYW5kbGVTaGFwZSxUaW1lclNoYXBlLG1ha2VIYW5kbGVTaGFwZSxTdWJzY3JpYmVyU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lclNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXJTaGFwZSA9ICRozY9fYSldXSxbXCJtYWtlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChtYWtlSGFuZGxlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbiAgICAgICBjb25zdCBDaG9pY2VNZXRob2RTaGFwZSA9IE0ub3IoJ3VucmFua2VkJywgJ29yZGVyJywgJ3BsdXJhbGl0eScpOyRozY9fb25jZS5DaG9pY2VNZXRob2RTaGFwZShDaG9pY2VNZXRob2RTaGFwZSk7XG4gICAgICAgY29uc3QgUXVvcnVtUnVsZVNoYXBlID0gTS5vcignbWFqb3JpdHknLCAnbm9fcXVvcnVtJywgJ2FsbCcpOyRozY9fb25jZS5RdW9ydW1SdWxlU2hhcGUoUXVvcnVtUnVsZVNoYXBlKTtcbiAgICAgICBjb25zdCBFbGVjdGlvblR5cGVTaGFwZSA9IE0ub3IoXG4gICdwYXJhbV9jaGFuZ2UnLFxuICAnZWxlY3Rpb24nLFxuICAnc3VydmV5JyxcbiAgJ2FwaV9pbnZvY2F0aW9uJyxcbiAgJ29mZmVyX2ZpbHRlcicsXG4pOyRozY9fb25jZS5FbGVjdGlvblR5cGVTaGFwZShFbGVjdGlvblR5cGVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBDbG9zaW5nUnVsZVNoYXBlID0ge1xuICB0aW1lcjogTS5lcmVmKFRpbWVyU2hhcGUpLFxuICBkZWFkbGluZTogVGltZXN0YW1wU2hhcGUsXG59OyRozY9fb25jZS5DbG9zaW5nUnVsZVNoYXBlKENsb3NpbmdSdWxlU2hhcGUpO1xuaGFyZGVuKENsb3NpbmdSdWxlU2hhcGUpO1xuXG4vKiBhbGwgdGhlIHN0cmluZ3MgdGhhdCB3aWxsIGJlIGluIHRoZSBmaWx0ZXIgYWZ0ZXIgcGFzc2luZyovXG4gICAgICAgY29uc3QgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlID0ge1xuICBzdHJpbmdzOiBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG59OyRozY9fb25jZS5ZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUoWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUgPSB7IGRvbnRVcGRhdGU6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5Ob09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZShOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUoT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlcklzc3VlU2hhcGUgPSB7IHN0cmluZ3M6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5PZmZlckZpbHRlcklzc3VlU2hhcGUoT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlcklzc3VlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiBDaG9pY2VNZXRob2RTaGFwZSxcbiAgaXNzdWU6IE9mZmVyRmlsdGVySXNzdWVTaGFwZSxcbiAgcG9zaXRpb25zOiBPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlLFxuICBlbGVjdGlvblR5cGU6ICdvZmZlcl9maWx0ZXInLFxuICBtYXhDaG9pY2VzOiAxLFxuICBtYXhXaW5uZXJzOiAxLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4vKiBrZXlzIGFyZSBwYXJhbWV0ZXIgbmFtZXMsIHZhbHVlcyBhcmUgcHJvcG9zZWQgdmFsdWVzKi9cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNTcGVjU2hhcGUgPSBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uYW55KCkpOyRozY9fb25jZS5QYXJhbUNoYW5nZXNTcGVjU2hhcGUoUGFyYW1DaGFuZ2VzU3BlY1NoYXBlKTtcbiAgICAgICBjb25zdCBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlID0gUGFyYW1DaGFuZ2VzU3BlY1NoYXBlOyRozY9fb25jZS5ZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSA9IHsgbm9DaGFuZ2U6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5Ob1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUoTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG4gIE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbVBhdGhTaGFwZSA9IHsga2V5OiBNLmFueSgpIH07JGjNj19vbmNlLlBhcmFtUGF0aFNoYXBlKFBhcmFtUGF0aFNoYXBlKTtcbmhhcmRlbihQYXJhbVBhdGhTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlID0ge1xuICBzcGVjOiB7XG4gICAgcGFyYW1QYXRoOiBQYXJhbVBhdGhTaGFwZSxcbiAgICBjaGFuZ2VzOiBQYXJhbUNoYW5nZXNTcGVjU2hhcGUsXG4gIH0sXG4gIGNvbnRyYWN0OiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZShQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6ICd1bnJhbmtlZCcsXG4gIGlzc3VlOiBQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlLFxuICBwb3NpdGlvbnM6IFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlLFxuICBlbGVjdGlvblR5cGU6ICdwYXJhbV9jaGFuZ2UnLFxuICBtYXhDaG9pY2VzOiAxLFxuICBtYXhXaW5uZXJzOiAxLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogJ21ham9yaXR5JyxcbiAgdGllT3V0Y29tZTogTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxufTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUoUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuY29uc3QgQXBpSW52b2NhdGlvblNwZWNTaGFwZSA9IHtcbiAgYXBpTWV0aG9kTmFtZTogTS5zdHJpbmcoKSxcbiAgbWV0aG9kQXJnczogTS5hcnJheU9mKE0uYW55KCkpLFxufTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlID0gQXBpSW52b2NhdGlvblNwZWNTaGFwZTskaM2PX29uY2UuWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUoWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUgPSB7IGRvbnRJbnZva2U6IE0uc3RyaW5nKCkgfTskaM2PX29uY2UuTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZShOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcbmhhcmRlbihOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG4gIE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5BcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUoQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6ICd1bnJhbmtlZCcsXG4gIGlzc3VlOiBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlLFxuICBwb3NpdGlvbnM6IEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSxcbiAgZWxlY3Rpb25UeXBlOiAnYXBpX2ludm9jYXRpb24nLFxuICBtYXhDaG9pY2VzOiAxLFxuICBtYXhXaW5uZXJzOiAxLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxufTskaM2PX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5BcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUoQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBTaW1wbGVTcGVjU2hhcGUgPSB7IHRleHQ6IE0uc3RyaW5nKCkgfTtcbmhhcmRlbihTaW1wbGVTcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSA9IHsgdGV4dDogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlKFllc1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKFllc1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTm9TaW1wbGVQb3NpdGlvblNoYXBlID0geyB0ZXh0OiBNLnN0cmluZygpIH07JGjNj19vbmNlLk5vU2ltcGxlUG9zaXRpb25TaGFwZShOb1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVQb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSxcbiAgTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxuXTskaM2PX29uY2UuU2ltcGxlUG9zaXRpb25zU2hhcGUoU2ltcGxlUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKFNpbXBsZVBvc2l0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZUlzc3VlU2hhcGUgPSBTaW1wbGVTcGVjU2hhcGU7JGjNj19vbmNlLlNpbXBsZUlzc3VlU2hhcGUoU2ltcGxlSXNzdWVTaGFwZSk7XG5oYXJkZW4oU2ltcGxlSXNzdWVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiBDaG9pY2VNZXRob2RTaGFwZSxcbiAgaXNzdWU6IFNpbXBsZUlzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogTS5hcnJheU9mKHsgdGV4dDogTS5zdHJpbmcoKSB9KSxcbiAgZWxlY3Rpb25UeXBlOiBNLm9yKCdlbGVjdGlvbicsICdzdXJ2ZXknKSxcbiAgbWF4Q2hvaWNlczogTS5ndGUoMSksXG4gIG1heFdpbm5lcnM6IE0uZ3RlKDEpLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb1NpbXBsZVBvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5TaW1wbGVRdWVzdGlvblNwZWNTaGFwZShTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSB7XG4gIC4uLlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5TaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZShTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUXVlc3Rpb25TcGVjU2hhcGUgPSBNLm9yKFxuICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUsXG4gIE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUsXG4gIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLFxuICBTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSxcbik7JGjNj19vbmNlLlF1ZXN0aW9uU3BlY1NoYXBlKFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFBvc2l0aW9uU2hhcGUgPSBNLm9yKFxuICBZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbiAgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSxcbiAgTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxuICBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuICBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG4pOyRozY9fb25jZS5Qb3NpdGlvblNoYXBlKFBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUXVlc3Rpb25IYW5kbGVTaGFwZSA9IG1ha2VIYW5kbGVTaGFwZSgncXVlc3Rpb24nKTtcblxuLyogVE9ETyhoaWJiZXJ0KTogYWRkIGRldGFpbHM7IG1vdmUgdG8gYSBtb3JlIGFwcHJvcHJpYXRlIGxvY2F0aW9uKi8kaM2PX29uY2UuUXVlc3Rpb25IYW5kbGVTaGFwZShRdWVzdGlvbkhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBJbnZpdGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbicpO1xuXG4vKiBYWFggSSB3YW50IHRvIGFkZCBxdWVzdGlvbkhhbmRsZSBhbmQgY291bnRlckluc3RhbmNlIHRvKi9cbi8qIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLiBJIGRvbid0IHNlZSBhbnkgYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIHRoZSovXG4vKiBtZXRob2RzIHRvIGVhY2ggbWVtYmVyIHNlcGFyYXRlbHkqLyRozY9fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBRdWVzdGlvbkRldGFpbHNTaGFwZSA9IE0ub3IoXG4gIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG4gIE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG4gIFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuKTskaM2PX29uY2UuUXVlc3Rpb25EZXRhaWxzU2hhcGUoUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRWxlY3RvcmF0ZVB1YmxpY0kgPSBNLmludGVyZmFjZSgnQ29tbWl0dGVlIFB1YmxpY0ZhY2V0Jywge1xuICBnZXRRdWVzdGlvblN1YnNjcmliZXI6IE0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgZ2V0T3BlblF1ZXN0aW9uczogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldE5hbWU6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICBnZXRRdWVzdGlvbjogTS5jYWxsKFF1ZXN0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLkVsZWN0b3JhdGVQdWJsaWNJKEVsZWN0b3JhdGVQdWJsaWNJKTtcbmNvbnN0IEVsZWN0b3JhdGVQdWJsaWNTaGFwZSA9IE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlUHVibGljJyk7XG5cbiAgICAgICBjb25zdCBFbGVjdG9yYXRlQ3JlYXRvckkgPSBNLmludGVyZmFjZSgnQ29tbWl0dGVlIEFkbWluRmFjZXQnLCB7XG4gIGdldFBvc2VySW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGFkZFF1ZXN0aW9uOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSwgUXVlc3Rpb25TcGVjU2hhcGUpLnJldHVybnMoXG4gICAgTS5wcm9taXNlKCksXG4gICksXG4gIGdldFZvdGVySW52aXRhdGlvbnM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0ucHJvbWlzZSgpKSksXG4gIGdldFF1ZXN0aW9uU3Vic2NyaWJlcjogTS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBnZXRQdWJsaWNGYWNldDogTS5jYWxsKCkucmV0dXJucyhFbGVjdG9yYXRlUHVibGljU2hhcGUpLFxufSk7JGjNj19vbmNlLkVsZWN0b3JhdGVDcmVhdG9ySShFbGVjdG9yYXRlQ3JlYXRvckkpO1xuXG4gICAgICAgY29uc3QgUXVlc3Rpb25TdGF0c1NoYXBlID0ge1xuICBzcG9pbGVkOiBNLm5hdCgpLFxuICB2b3RlczogTS5uYXQoKSxcbiAgcmVzdWx0czogTS5hcnJheU9mKHsgcG9zaXRpb246IFBvc2l0aW9uU2hhcGUsIHRvdGFsOiBNLm5hdCgpIH0pLFxufTskaM2PX29uY2UuUXVlc3Rpb25TdGF0c1NoYXBlKFF1ZXN0aW9uU3RhdHNTaGFwZSk7XG5oYXJkZW4oUXVlc3Rpb25TdGF0c1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uSSA9IE0uaW50ZXJmYWNlKCdRdWVzdGlvbicsIHtcbiAgZ2V0Vm90ZUNvdW50ZXI6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gIGdldERldGFpbHM6IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxufSk7JGjNj19vbmNlLlF1ZXN0aW9uSShRdWVzdGlvbkkpO1xuY29uc3QgUXVlc3Rpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdRdWVzdGlvbicpO1xuXG4gICAgICAgY29uc3QgQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJID0gTS5pbnRlcmZhY2UoXG4gICdCaW5hcnlWb3RlQ291bnRlciBQdWJsaWNGYWNldCcsXG4gIHtcbiAgICBnZXRRdWVzdGlvbjogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvblNoYXBlKSxcbiAgICBpc09wZW46IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIGdldE91dGNvbWU6IE0uY2FsbCgpLnJldHVybnMoTS5lcmVmKE0ucHJvbWlzZSgpKSksXG4gICAgZ2V0U3RhdHM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGdldERldGFpbHM6IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxuICAgIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICB9LFxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJKEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSk7XG5cbiAgICAgICBjb25zdCBWb3RlckhhbmRsZSA9IE0ucmVtb3RhYmxlKCk7JGjNj19vbmNlLlZvdGVySGFuZGxlKFZvdGVySGFuZGxlKTtcbiAgICAgICBjb25zdCBCaW5hcnlWb3RlQ291bnRlckFkbWluSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgQWRtaW5GYWNldCcsXG4gIHtcbiAgICBzdWJtaXRWb3RlOiBNLmNhbGwoVm90ZXJIYW5kbGUsIE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChNLm5hdCgpKVxuICAgICAgLnJldHVybnMoeyBjaG9zZW46IFBvc2l0aW9uU2hhcGUsIHNoYXJlczogTS5uYXQoKSB9KSxcbiAgfSxcbik7JGjNj19vbmNlLkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JKEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JKTtcblxuICAgICAgIGNvbnN0IEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJID0gTS5pbnRlcmZhY2UoXG4gICdCaW5hcnlWb3RlQ291bnRlciBDbG9zZUZhY2V0JyxcbiAge1xuICAgIGNsb3NlVm90aW5nOiBNLmNhbGwoKS5yZXR1cm5zKCksXG4gIH0sXG4pOyRozY9fb25jZS5CaW5hcnlWb3RlQ291bnRlckNsb3NlSShCaW5hcnlWb3RlQ291bnRlckNsb3NlSSk7XG5cbiAgICAgICBjb25zdCBWb3RlQ291bnRlclB1YmxpY0kgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgUHVibGljRmFjZXQnLCB7XG4gIGdldFF1ZXN0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uU2hhcGUpLFxuICBpc09wZW46IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRPdXRjb21lOiBNLmNhbGwoKS5yZXR1cm5zKE0uZXJlZihNLnByb21pc2UoKSkpLFxuICBnZXRTdGF0czogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldERldGFpbHM6IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbn0pOyRozY9fb25jZS5Wb3RlQ291bnRlclB1YmxpY0koVm90ZUNvdW50ZXJQdWJsaWNJKTtcblxuICAgICAgIGNvbnN0IFZvdGVDb3VudGVyQWRtaW5JID0gTS5pbnRlcmZhY2UoJ1ZvdGVDb3VudGVyIEFkbWluRmFjZXQnLCB7XG4gIHN1Ym1pdFZvdGU6IE0uY2FsbChWb3RlckhhbmRsZSwgTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChNLm5hdCgpKVxuICAgIC5yZXR1cm5zKHsgY2hvc2VuOiBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSksIHNoYXJlczogTS5uYXQoKSB9KSxcbn0pOyRozY9fb25jZS5Wb3RlQ291bnRlckFkbWluSShWb3RlQ291bnRlckFkbWluSSk7XG5cbiAgICAgICBjb25zdCBWb3RlQ291bnRlckNsb3NlSSA9IE0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBDbG9zZUZhY2V0Jywge1xuICBjbG9zZVZvdGluZzogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLlZvdGVDb3VudGVyQ2xvc2VJKFZvdGVDb3VudGVyQ2xvc2VJKTtcblxuICAgICAgIGNvbnN0IEdvdmVybm9yRmFjZXRTaGFwZSA9IHtcbiAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ3BhcmFtUmV0cmlldmVyJykpLFxuICBnZXRJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKEludml0YXRpb25TaGFwZSksXG4gIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoKSksXG4gIGdldEdvdmVybmVkQXBpczogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnZ292ZXJuZWRBUElzJykpLFxuICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gIHNldE9mZmVyRmlsdGVyOiBNLmNhbGwoTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn07JGjNj19vbmNlLkdvdmVybm9yRmFjZXRTaGFwZShHb3Zlcm5vckZhY2V0U2hhcGUpO1xuaGFyZGVuKEdvdmVybm9yRmFjZXRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDaG9pY2VNZXRob2RTaGFwZSI6WyJDaG9pY2VNZXRob2RTaGFwZSJdLCJRdW9ydW1SdWxlU2hhcGUiOlsiUXVvcnVtUnVsZVNoYXBlIl0sIkVsZWN0aW9uVHlwZVNoYXBlIjpbIkVsZWN0aW9uVHlwZVNoYXBlIl0sIkNsb3NpbmdSdWxlU2hhcGUiOlsiQ2xvc2luZ1J1bGVTaGFwZSJdLCJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiOlsiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIl0sIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIl0sIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiOlsiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSJdLCJPZmZlckZpbHRlcklzc3VlU2hhcGUiOlsiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIl0sIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiOlsiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSJdLCJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIjpbIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIjpbIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSJdLCJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSI6WyJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSJdLCJQYXJhbVBhdGhTaGFwZSI6WyJQYXJhbVBhdGhTaGFwZSJdLCJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIjpbIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiXSwiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSI6WyJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSJdLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiOlsiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiOlsiTm9TaW1wbGVQb3NpdGlvblNoYXBlIl0sIlNpbXBsZVBvc2l0aW9uc1NoYXBlIjpbIlNpbXBsZVBvc2l0aW9uc1NoYXBlIl0sIlNpbXBsZUlzc3VlU2hhcGUiOlsiU2ltcGxlSXNzdWVTaGFwZSJdLCJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSI6WyJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSJdLCJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJRdWVzdGlvblNwZWNTaGFwZSI6WyJRdWVzdGlvblNwZWNTaGFwZSJdLCJQb3NpdGlvblNoYXBlIjpbIlBvc2l0aW9uU2hhcGUiXSwiUXVlc3Rpb25IYW5kbGVTaGFwZSI6WyJRdWVzdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiRWxlY3RvcmF0ZVB1YmxpY0kiOlsiRWxlY3RvcmF0ZVB1YmxpY0kiXSwiRWxlY3RvcmF0ZUNyZWF0b3JJIjpbIkVsZWN0b3JhdGVDcmVhdG9ySSJdLCJRdWVzdGlvblN0YXRzU2hhcGUiOlsiUXVlc3Rpb25TdGF0c1NoYXBlIl0sIlF1ZXN0aW9uSSI6WyJRdWVzdGlvbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIjpbIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlckhhbmRsZSI6WyJWb3RlckhhbmRsZSJdLCJCaW5hcnlWb3RlQ291bnRlckFkbWluSSI6WyJCaW5hcnlWb3RlQ291bnRlckFkbWluSSJdLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSI6WyJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSJdLCJWb3RlQ291bnRlclB1YmxpY0kiOlsiVm90ZUNvdW50ZXJQdWJsaWNJIl0sIlZvdGVDb3VudGVyQWRtaW5JIjpbIlZvdGVDb3VudGVyQWRtaW5JIl0sIlZvdGVDb3VudGVyQ2xvc2VJIjpbIlZvdGVDb3VudGVyQ2xvc2VJIl0sIkdvdmVybm9yRmFjZXRTaGFwZSI6WyJHb3Zlcm5vckZhY2V0U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYrMHFVUMAABVDAAAKgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy92b3RlcktpdC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVZvdGVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxwcmVwYXJlRXhvQ2xhc3NLaXQsZGVmaW5lRHVyYWJsZUhhbmRsZSxFLFBvc2l0aW9uU2hhcGUsUXVlc3Rpb25IYW5kbGVTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzXCIsIFtbXCJkZWZpbmVEdXJhYmxlSGFuZGxlXCIsWyRozY9fYSA9PiAoZGVmaW5lRHVyYWJsZUhhbmRsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJQb3NpdGlvblNoYXBlXCIsWyRozY9fYSA9PiAoUG9zaXRpb25TaGFwZSA9ICRozY9fYSldXSxbXCJRdWVzdGlvbkhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAoUXVlc3Rpb25IYW5kbGVTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBIYW5kbGUsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQsIFZvdGVDb3VudGVyUHVibGljRmFjZXQsIFF1ZXN0aW9uU3BlYywgT3V0Y29tZVJlY29yZCwgQWRkUXVlc3Rpb24sIEFkZFF1ZXN0aW9uUmV0dXJuLCBDb21wbGV0ZWRCYWxsZXQsIFBvc2l0aW9ufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbmNvbnN0IFZvdGVySSA9IE0uaW50ZXJmYWNlKCd2b3RlcicsIHtcbiAgY2FzdEJhbGxvdEZvcjogTS5jYWxsKFF1ZXN0aW9uSGFuZGxlU2hhcGUsIE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSkucmV0dXJucyhcbiAgICBNLnByb21pc2UoKSxcbiAgKSxcbn0pO1xuXG5jb25zdCBJbnZpdGF0aW9uTWFrZXJJID0gTS5pbnRlcmZhY2UoJ2ludml0YXRpb25NYWtlcicsIHtcbiAgbWFrZVZvdGVJbnZpdGF0aW9uOiBNLmNhbGwoXG4gICAgTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpLFxuICAgIFF1ZXN0aW9uSGFuZGxlU2hhcGUsXG4gICkucmV0dXJucyhNLnByb21pc2UoKSksXG59KTtcblxuLyoqXG4gKiBNYWtlIGEga2l0IHN1aXRhYmxlIGZvciByZXR1cm5pbmcgdG8gYSB2b3RlciBpbnZpdGVkIHRvIGEgY29tbWl0dGVlLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtvYmplY3R9IHBvd2Vyc1xuICogQHBhcmFtIHtaQ0Z9IHBvd2Vycy56Y2ZcbiAqIEBwYXJhbSB7KHF1ZXN0aW9uSGFuZGxlOiBIYW5kbGU8J1F1ZXN0aW9uJz4sIHZvdGVySGFuZGxlOiBIYW5kbGU8J1ZvdGVyJz4sIGNob3NlblBvc2l0aW9uczogUG9zaXRpb25bXSwgd2VpZ2h0OiBiaWdpbnQpID0+IEVSZWY8Q29tcGxldGVkQmFsbGV0Pn0gcG93ZXJzLnN1Ym1pdFZvdGVcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVWb3RlcktpdCA9IChiYWdnYWdlLCB7IHN1Ym1pdFZvdGUsIHpjZiB9KSA9PiB7XG4gIGNvbnN0IG1ha2VWb3RlckhhbmRsZSA9IGRlZmluZUR1cmFibGVIYW5kbGUoYmFnZ2FnZSwgJ1ZvdGVyJyk7XG4gIGNvbnN0IG1ha2VWb3RlcktpdCA9IHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgICdWb3RlcktpdCcsXG4gICAgeyB2b3RlcjogVm90ZXJJLCBpbnZpdGF0aW9uTWFrZXJzOiBJbnZpdGF0aW9uTWFrZXJJIH0sXG4gICAgaWQgPT4ge1xuICAgICAgY29uc3Qgdm90ZXJIYW5kbGUgPSBtYWtlVm90ZXJIYW5kbGUoKTtcbiAgICAgIHJldHVybiB7IGlkLCB2b3RlckhhbmRsZSB9O1xuICAgIH0sXG4gICAge1xuICAgICAgdm90ZXI6IHtcbiAgICAgICAgY2FzdEJhbGxvdEZvcihxdWVzdGlvbkhhbmRsZSwgcG9zaXRpb25zLCB3ZWlnaHQgPSAxbikge1xuICAgICAgICAgIGNvbnN0IHsgdm90ZXJIYW5kbGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcmV0dXJuIEUoc3VibWl0Vm90ZSkocXVlc3Rpb25IYW5kbGUsIHZvdGVySGFuZGxlLCBwb3NpdGlvbnMsIHdlaWdodCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaW52aXRhdGlvbk1ha2Vyczoge1xuICAgICAgICBtYWtlVm90ZUludml0YXRpb24ocG9zaXRpb25zLCBxdWVzdGlvbkhhbmRsZSkge1xuICAgICAgICAgIGNvbnN0IHsgdm90ZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGNvbnRpbnVpbmdWb3RlSGFuZGxlciA9IGNTZWF0ID0+IHtcbiAgICAgICAgICAgIGNTZWF0LmV4aXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2b3Rlci5jYXN0QmFsbG90Rm9yKHF1ZXN0aW9uSGFuZGxlLCBwb3NpdGlvbnMpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKGNvbnRpbnVpbmdWb3RlSGFuZGxlciwgJ3ZvdGUnKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VWb3RlcktpdDtcbn07JGjNj19vbmNlLnByZXBhcmVWb3RlcktpdChwcmVwYXJlVm90ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVWb3RlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlVm90ZXJLaXQiOlsicHJlcGFyZVZvdGVyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FsbEUiLCJjYWxsU3luYyIsImlzQ2FsbGJhY2siLCJtYWtlRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VNZXRob2RDYWxsYmFjayIsIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siLCJwcmVwYXJlQXR0ZW51YXRvciIsInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZUVycm9yLHEsRSxpc1ByaW1pdGl2ZSxpc1Bhc3NhYmxlU3ltYm9sLGdldEludGVyZmFjZU1ldGhvZEtleXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldEludGVyZmFjZU1ldGhvZEtleXNcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2ZhcidcbiAqIEBpbXBvcnQge01ldGhvZHN9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtGYXJhYmxlfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cbi8qKiBAaW1wb3J0IHtDYWxsYmFjaywgU3luY0NhbGxiYWNrfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IHsgb3duS2V5czogcmF3T3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IG93bktleXMgPVxuICAvKiogQHR5cGUgezxUIGV4dGVuZHMgUHJvcGVydHlLZXk+KG9iajogeyBbSyBpbiBUXT86IHVua25vd24gfSkgPT4gVFtdfSAqLyAoXG4gICAgcmF3T3duS2V5c1xuICApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlQXR0ZW51YXRvcj4+XG4gKiApID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGtleVxuICogQHJldHVybnMge2tleSBpcyBQcm9wZXJ0eUtleX0gRklYTUU6IHNob3VsZCBiZSBqdXN0IGBQcm9wZXJ0eUtleWAgYnV0IFRTXG4gKiAgIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXkgPSBrZXkgPT4ge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogU3luY2hyb25vdXNseSBjYWxsIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtTeW5jQ2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEk+fVxuICovXG4gICAgICAgY29uc3QgY2FsbFN5bmMgPSAoY2FsbGJhY2ssIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0YXJnZXQoLi4uYm91bmQsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsIC4uLmFyZ3MpO1xufTskaM2PX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLyoqXG4gKiBFdmVudHVhbCBzZW5kIHRvIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbiAgICAgICBjb25zdCBjYWxsRSA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPn0gW1Q9SV1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sgPSAodGFyZ2V0LCAuLi5ib3VuZCkgPT4ge1xuICB0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgRmFpbGBzeW5jIGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb246ICR7dGFyZ2V0fWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIGJvdW5kLCBpc1N5bmM6IHRydWUgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge1N5bmNDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayhtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIHBvdGVudGlhbGx5IGZhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge0VSZWY8KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPj59IFtUPUVSZWY8ST5dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST47XG4gKiB9fSBbVD17IFt4IGluIFBdOiBJIH1dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY01ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSB8fFxuICAgIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IFBcbiAqIEB0ZW1wbGF0ZSB7RVJlZjx7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+O1xuICogfT59IFtUPUVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UH0gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZU1ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZU1ldGhvZENhbGxiYWNrKG1ha2VNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZU1ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtjYWxsYmFjayBpcyBDYWxsYmFjazxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNDYWxsYmFjayA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGlzUHJpbWl0aXZlKGNhbGxiYWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICByZXR1cm4gKFxuICAgICFpc1ByaW1pdGl2ZSh0YXJnZXQpICYmXG4gICAgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpKSAmJlxuICAgIEFycmF5LmlzQXJyYXkoYm91bmQpXG4gICk7XG59OyRozY9fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHtcbiAqICAgW0sgaW4gTV06IE1ldGhvZEd1YXJkO1xuICogfT59IFtvcHRzLmludGVyZmFjZUd1YXJkXVxuICogICBBbiBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZSBuZXcgYXR0ZW51YXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddIEEgdGFnIGZvciB0aGUgbmV3IGF0dGVudWF0b3IgZXhvQ2xhc3MuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQXR0ZW51YXRvciA9IChcbiAgem9uZSxcbiAgbWV0aG9kTmFtZXMsXG4gIHsgaW50ZXJmYWNlR3VhcmQsIHRhZyA9ICdBdHRlbnVhdG9yJyB9ID0ge30sXG4pID0+IHtcbiAgLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kXG4gKlxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbCB9fSBPdmVycmlkZXNcbiAqXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXTogKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueSB9fSBNZXRob2RzXG4gKi9cbiAgY29uc3QgbWV0aG9kcyA9IC8qKiBAdHlwZSB7TWV0aG9kc30gKi8gKFxuICAgIGZyb21FbnRyaWVzKFxuICAgICAgbWV0aG9kTmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgIC8qIE9ubHkgYWxsb3cgdGhlIGBQcm9wZXJ0eUtleWAgdHlwZSBmb3IgdGhlIHRhcmdldCBtZXRob2Qga2V5LiovXG4gICAgICAgIGlmICghaXNQcm9wZXJ0eUtleShrZXkpKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBrZXkgJHtxKGtleSl9IGlzIG5vdCBhIFByb3BlcnR5S2V5YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG0gPSAvKiogQHR5cGUge01ldGhvZHN9ICovICh7XG4gICAgICAgICAgLyogRXhwbGljaXRseSB1c2UgY29uY2lzZSBtZXRob2Qgc3ludGF4IHRvIHByZXNlcnZlIGB0aGlzYCBidXQgcHJldmVudCovXG4gICAgICAgICAgLyogY29uc3RydWN0b3IgYmVoYXZpb3IuKi9cbiAgICAgICAgICAvKiogQHR5cGUge01ldGhvZH0gKi9cbiAgICAgICAgICBba2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvKiBTdXBwb3J0IGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jIGNhbGxiYWNrcy4qL1xuICAgICAgICAgICAgY29uc3QgY2IgPSB0aGlzLnN0YXRlLmNic1trZXldO1xuICAgICAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNiLmlzU3luYykge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbFN5bmMoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxFKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KVtrZXldO1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtrZXksIG1dKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKTtcblxuICAvKipcbiAqIENyZWF0ZSBhbiBleG8gb2JqZWN0IHdob3NlIGJlaGF2aW9yIGlzIGNvbXBvc2VkIGZyb20gYSBkZWZhdWx0IHRhcmdldFxuICogYW5kL29yIGluZGl2aWR1YWwgbWV0aG9kIG92ZXJyaWRlIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHt1bmtub3dufSBbb3B0cy50YXJnZXRdIFRoZSB0YXJnZXQgZm9yIGFueSBtZXRob2RzIHRoYXQgd2VyZW4ndFxuICogICBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqICAgYXMgc3luY2hyb25vdXNseSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXSBTZXQgaW5kaXZpZHVhbCBjYWxsYmFja3MgZm9yIG1ldGhvZHNcbiAqICAgKHdob3NlIG5hbWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYHByZXBhcmVBdHRlbnVhdG9yYCBvclxuICogICBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gTnVsbGlzaCBvdmVycmlkZXMgbWVhbiB0byB0aHJvdy5cbiAqL1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIC8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7YW55fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luY11cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdXG4gKi9cbiAgICAoe1xuICAgICAgdGFyZ2V0ID0gbnVsbCxcbiAgICAgIGlzU3luYyA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSksXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgY2JzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSk7XG5cbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQobWV0aG9kTmFtZXMpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICAgIHJlbWFpbmluZy5oYXMoa2V5KSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgIGNvbnN0IGNiID0gb3ZlcnJpZGVzW2tleV07XG4gICAgICAgIGNiID09IG51bGwgfHxcbiAgICAgICAgICBpc0NhbGxiYWNrKGNiKSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuICAgICAgICBjYnNba2V5XSA9IGNiO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVtYWluaW5nKSB7XG4gICAgICAgIGlmIChpc1N5bmMpIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcmRlbih7IGNicywgaXNTeW5jIH0pO1xuICAgIH0sXG4gICAgLyoqIEB0eXBlIHtNZXRob2RzfSAqLyAobWV0aG9kcyksXG4gICk7XG4gIHJldHVybiBtYWtlQXR0ZW51YXRvcjtcbn07JGjNj19vbmNlLnByZXBhcmVBdHRlbnVhdG9yKHByZXBhcmVBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvcik7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIHdob3NlIG1ldGhvZE5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGludGVyZmFjZUd1YXJkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7SW50ZXJmYWNlR3VhcmR9IEdcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtHfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ11cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciA9ICh6b25lLCBpbnRlcmZhY2VHdWFyZCwgb3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhpbnRlcmZhY2VHdWFyZCk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3Ioem9uZSwgbWV0aG9kTmFtZXMsIHtcbiAgICAuLi5vcHRzLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TWFrZUF0dGVudWF0b3I8YW55Pn0gKi8gKG1ha2VBdHRlbnVhdG9yKTtcbn07JGjNj19vbmNlLnByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKM2T6b1BAAA9QQAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ0b0NMSU9wdGlvbnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nLWtleWVkIG9iamVjdCBpbnRvIGFuIGFycmF5IG9mIENMSSBvcHRpb25zLCB1c2luZyBlYWNoIGtleSBhc1xuICogdGhlIG5hbWUgb2YgYSBHTlUtc3R5bGUgbG9uZyBvcHRpb24gYC0tJHtrZXl9YCwgaWdub3JpbmcgZWFjaCBrZXkgd2l0aCBhblxuICogdW5kZWZpbmVkIHZhbHVlIGFuZCBjb252ZXJ0aW5nIGJvb2xlYW4gdmFsdWVzIGludG8gbm8tYXJndW1lbnQgYC0tJHtrZXl9YCBvclxuICogYC0tbm8tJHtrZXl9YCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IHN0cmluZyB8IHN0cmluZ1tdPn0gcmVjb3JkIC1cbiAqICAgZS5nLiB7IGNvbG9yOiAnYmx1ZScgfVxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIGUuZy4gWyctLWNvbG9yJywgJ2JsdWUnXVxuICovXG4gICAgICAgY29uc3QgdG9DTElPcHRpb25zID0gcmVjb3JkID0+XG4gIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiBbYC0tJHtrZXl9YF07XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIFtgLS1uby0ke2tleX1gXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8qIFJlcHJlc2VudCBhcyBhIHJlcGVhdGVkIG9wdGlvbi4qL1xuICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAodiA9PiBbYC0tJHtrZXl9YCwgdl0pO1xuICAgIH1cbiAgICByZXR1cm4gW2AtLSR7a2V5fWAsIHZhbHVlXTtcbiAgfSk7JGjNj19vbmNlLnRvQ0xJT3B0aW9ucyh0b0NMSU9wdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidG9DTElPcHRpb25zIjpbInRvQ0xJT3B0aW9ucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtDXgVygwAAMoMAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6WyIuL2tleU1pcnJvci5qcyJdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiLCJWQmFua0FjY291bnQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5TWlycm9yOyRozY9faW1wb3J0cyhbW1wiLi9rZXlNaXJyb3IuanNcIiwgW1tcImtleU1pcnJvclwiLFskaM2PX2EgPT4gKGtleU1pcnJvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGZpbGVcbiAqXG4gKiAgIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiAgIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAgYW5kIG91ciBsYXggcGFja2FnZVxuICogICBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb25cbiAqICAgZXJyb3JzLlxuICpcbiAqICAgU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZVxuICogICBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIENsdXN0ZXJOYW1lIHNwZWNpZmllcyBhIGNvbGxlY3Rpb24gb2YgbmV0d29ya3MuIFRoZSBzcGVjaWZpYyBuZXR3b3Jrc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBuYW1lIG1heSB2YXJ5IGZyb20gY29udGV4dCB0byBjb250ZXh0LCBhbmQgbWF5XG4gKiBhbHNvIG92ZXJsYXAgKGUuZy4gYSBcImxvY2FsXCIgY2x1c3RlciBtYXkgY29ubmVjdCB0byB0aGUgc2FtZSByZW1vdGUgbmV0d29ya3NcbiAqIGFzIGEgXCJ0ZXN0bmV0XCIgY2x1c3RlciksIGJ1dCB0aGlzIHR5cGUgbmV2ZXJ0aGVsZXNzIHN1cHBvcnRzIGNyb3NzLXBhY2thZ2VcbiAqIGNvb3JkaW5hdGlvbiB3aGVyZSB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgbGFiZWxzIGFyZSBzdWJqZWN0IHRvXG4gKiBjaG9pY2Ugb2YgY2x1c3Rlci4gU29tZSBleGFtcGxlczpcbiAqXG4gKiAtIHRoZSBjaGFpbiBJRCBmb3IgYSBzdGF0aWMgbGFiZWwgbGlrZSBcIkFnb3JpY1wiIG9yIFwiRXRoZXJldW1cIlxuICogLSB0aGUgY3J5cHRvZ3JhcGhpYyBoYXNoIGZvciBhIHN0YXRpYyBsYWJlbCBsaWtlIFwiQkxEXCIgb3IgXCJVU0RDXCJcbiAqIC0gdGhlIFVSTCBmb3IgYSBzZXJ2aWNlIGxpa2UgXCJBZ29yaWMgUlBDXCIgb3IgXCJBeGVsYXJcIiBvciBcIlNwZWN0cnVtXCJcbiAqXG4gKiBcIm1haW5uZXRcIiBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIEFnb3JpYyBuZXR3b3JrIGRlc2NyaWJlZCBieVxuICogaHR0cHM6Ly9tYWluLmFnb3JpYy5uZXQvbmV0d29yay1jb25maWcgcmF0aGVyIHRoYW4gc29tZSBvdGhlciBhbHRlcm5hdGl2ZS5cbiAqXG4gKiBYWFggVGhpcyBhY3R1YWxseSBiZWxvbmdzIHNvbWV3aGVyZSBlbHNlLCBwb3NzaWJseSB3aXRoIHJlZmFjdG9yaW5nLlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMTIxODUjZGlzY3Vzc2lvbl9yMjUwMDEyMzIyNlxuICpcbiAqIEB0eXBlZGVmIHsnbG9jYWwnIHwgJ3Rlc3RuZXQnIHwgJ21haW5uZXQnfSBDbHVzdGVyTmFtZVxuICovXG5cbi8qKlxuICogRXZlbnQgc291cmNlIGlkcyB1c2VkIGJ5IHRoZSBicmlkZ2UgZGV2aWNlLlxuICpcbiAqIEBlbnVtIHsodHlwZW9mIEJyaWRnZUlkKVtrZXlvZiB0eXBlb2YgQnJpZGdlSWRdfVxuICovXG4gICAgICAgY29uc3QgQnJpZGdlSWQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBCQU5LOiAnYmFuaycsXG4gIENPUkU6ICdjb3JlJyxcbiAgRElCQzogJ2RpYmMnLFxuICBTVE9SQUdFOiAnc3RvcmFnZScsXG4gIFBST1ZJU0lPTjogJ3Byb3Zpc2lvbicsXG4gIFBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6ICdwcm92aXNpb25XYWxsZXQnLFxuICBWTE9DQUxDSEFJTjogJ3Zsb2NhbGNoYWluJyxcbiAgVlRSQU5TRkVSOiAndnRyYW5zZmVyJyxcbiAgV0FMTEVUOiAnd2FsbGV0Jyxcbn0pOyRozY9fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5oYXJkZW4oQnJpZGdlSWQpO1xuXG4vKiogQHNhdGlzZmllcyB7UmVjb3JkPHN0cmluZywgQnJpZGdlSWQ+fSAqL1xuICAgICAgIGNvbnN0IENvc21vc0luaXRLZXlUb0JyaWRnZUlkID0ge1xuICB2YmFua1BvcnQ6ICdiYW5rJyxcbiAgdmliY1BvcnQ6ICdkaWJjJyxcbn07JGjNj19vbmNlLkNvc21vc0luaXRLZXlUb0JyaWRnZUlkKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcbmhhcmRlbihDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCk7XG5cbiAgICAgICBjb25zdCBXYWxsZXROYW1lID0ga2V5TWlycm9yKHtcbiAgZGVwb3NpdEZhY2V0OiBudWxsLFxufSk7JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbiAgICAgICBjb25zdCBWQmFua0FjY291bnQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICByZXNlcnZlOiB7XG4gICAgbW9kdWxlOiAndmJhbmsvcmVzZXJ2ZScsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCcsXG4gIH0sXG4gIHByb3Zpc2lvbjoge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Byb3Zpc2lvbicsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFtZWd6eXRnNjVjeXJnenM2ZnZ6eGdyY3F2d3dsN3VncHQ2MjM0NicsXG4gIH0sXG59KTskaM2PX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyaWRnZUlkIjpbIkJyaWRnZUlkIl0sIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIjpbIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIl0sIldhbGxldE5hbWUiOlsiV2FsbGV0TmFtZSJdLCJWQmFua0FjY291bnQiOlsiVkJhbmtBY2NvdW50Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI29pgGuCAAArggAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VUcmFjZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQGplc3NpZS1jaGVjayovXG5cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ0Ki9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbmxldCBkZWJ1Z0luc3RhbmNlID0gMTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVHJhY2VyID0gKGxhYmVsLCBlbmFibGUgPSB0cnVlKSA9PiB7XG4gIGNvbnN0IHN1YiA9IChzdWJMYWJlbCwgc3ViRW5hYmxlID0gZW5hYmxlKSA9PlxuICAgIG1ha2VUcmFjZXIoYCR7bGFiZWx9LiR7c3ViTGFiZWx9YCwgc3ViRW5hYmxlKTtcbiAgY29uc3Qga2V5ID0gYC0tLS0tICR7bGFiZWx9LCR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICAvKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG4gIHN3aXRjaCAoZW5hYmxlKSB7XG4gICAgY2FzZSBmYWxzZToge1xuICAgICAgY29uc3QgbG9nRGlzYWJsZWQgPSAoLi4uX2FyZ3MpID0+IHt9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGxvZ0Rpc2FibGVkLCB7IHN1YiB9KSk7XG4gICAgfVxuICAgIGNhc2UgJ3ZlcmJvc2UnOiB7XG4gICAgICBjb25zdCBpbmZvVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgLyogWFhYIFNuaWZmIHRlc3RzIHN1Y2ggYXMgdGhpcyBhcmUgaW5oZXJlbnRseSB1bnJlbGlhYmxlIGFuZCBzbWVsbCBiYWQuKi9cbiAgICAgICAgLyogRXZlbiBhc2lkZSBmcm9tIHRoZSBzZWN1cml0eSBoYXphcmQgb2YqL1xuICAgICAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbiAgICAgICAgLyogYW4gb2JqZWN0IGludGVuZGVkIGFzIGEgbm9ybWFsIGxvZ2dpbmcgYXJndW1lbnQgbWF5IGFjY2lkZW50YWxseSovXG4gICAgICAgIC8qIHBhc3MgdGhpcyBzbmlmZiB0ZXN0LCBjYXVzaW5nIGNvbmZ1c2lvbi4qL1xuICAgICAgICBpZiAodHlwZW9mIG9wdExvZz8ubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihpbmZvVGljaywgeyBzdWIgfSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBkZWJ1Z1RpY2sgPSAob3B0TG9nLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8qIEFub3RoZXIgdW5yZWxpYWJsZSBzbmlmZiB0ZXN0IGxpa2UgdGhlIG9uZSBhYm92ZSovXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0TG9nPy5sb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRMb2cubG9nKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihkZWJ1Z1RpY2ssIHsgc3ViIH0pKTtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG5cbi8qKlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VUcmFjZXI+fSBUcmFjZUxvZ2dlclxuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsZPVjl4DAABeAwAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IE5vbk51bGxpc2ggPSAodmFsLCBvcHREZXRhaWxzID0gYHVuZXhwZWN0ZWQgJHtxKHZhbCl9YCkgPT4ge1xuICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAvKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xufTskaM2PX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoHOwa/gQAAP4EAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY2xpLXV0aWxzLmpzIiwiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9rZXlNaXJyb3IuanMiLCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL21ldHJpY3MuanMiLCIuL25hdHVyYWwtc29ydC5qcyIsIi4vc2VzLXV0aWxzLmpzIiwiLi90bXBEaXIuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9jbGktdXRpbHMuanMiLCIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL2tleU1pcnJvci5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vY2xpLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4va2V5TWlycm9yLmpzXCIsIFtdXSxbXCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi9tZXRyaWNzLmpzXCIsIFtdXSxbXCIuL25hdHVyYWwtc29ydC5qc1wiLCBbXV0sW1wiLi9zZXMtdXRpbHMuanNcIiwgW11dLFtcIi4vdG1wRGlyLmpzXCIsIFtdXSxbXCIuL3R5cGVDaGVjay5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9tYXJzaGFsL3B1cmUtZGF0YS5qcyI6W1sicHVyZURhdGFNYXJzaGFsbGVyIiwicHVyZURhdGFNYXJzaGFsbGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACq1a+NpiUAAKYlAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJUUlVFIiwiZGVlcENvcHlKc29uYWJsZSIsImRlZXBNYXBPYmplY3QiLCJkZWZpbmVOYW1lIiwiZnJvbVR5cGVkRW50cmllcyIsImxvZ0xldmVscyIsIm1ha2VNZWFzdXJlU2Vjb25kcyIsIm9iamVjdE1hcE11dGFibGUiLCJwYXJ0aWFsTWFwIiwicHJvdmlkZUxhenlNYXAiLCJ0eXBlZEVudHJpZXMiLCJ0eXBlZE1hcCIsInVucHJlZml4ZWRQcm9wZXJ0aWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cbi8qKlxuICogQGZpbGUgUHVyZSBKYXZhU2NyaXB0IHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBidXQgbm90XG4gKiAgIGRlcGVuZGVudCB1cG9uIGEgaGFyZGVuZWQgZW52aXJvbm1lbnQuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0eSB9ID0gT2JqZWN0O1xuXG4vKiogRm9yIG92ZXJyaWRpbmcgVHlwZVNjcmlwdCBpbmZlcnJpbmcgdGhlIHR5cGUgb2YgYHRydWVgIGFzIGJvb2xlYW4uICovXG4gICAgICAgY29uc3QgVFJVRSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh0cnVlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PE8gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gKiAgIG9iajogTyxcbiAqICkgPT4gRXhjbHVkZTxcbiAqICAgeyBbSyBpbiBrZXlvZiBPXTogSyBleHRlbmRzIHN0cmluZyA/IFtLLCBPW0tdXSA6IG5ldmVyIH1ba2V5b2YgT10sXG4gKiAgIHVuZGVmaW5lZFxuICogPltdfSBUeXBlZEVudHJpZXNcbiAqLyRozY9fb25jZS5UUlVFKFRSVUUpO1xuICAgICAgIGNvbnN0IHR5cGVkRW50cmllcyA9IC8qKiBAdHlwZSB7VHlwZWRFbnRyaWVzfSAqLyAoT2JqZWN0LmVudHJpZXMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8XG4gKiAgIGNvbnN0IEVudHJpZXMgZXh0ZW5kcyBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtQcm9wZXJ0eUtleSwgdW5rbm93bl0+LFxuICogPihcbiAqICAgZW50cmllczogRW50cmllcyxcbiAqICkgPT4geyBbRW50cnkgaW4gRW50cmllc1tudW1iZXJdIGFzIEVudHJ5WzBdXTogRW50cnlbMV0gfX0gRnJvbVR5cGVkRW50cmllc1xuICovJGjNj19vbmNlLnR5cGVkRW50cmllcyh0eXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IGZyb21UeXBlZEVudHJpZXMgPSAvKiogQHR5cGUge0Zyb21UeXBlZEVudHJpZXN9ICovIChcbiAgT2JqZWN0LmZyb21FbnRyaWVzXG4pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QSBleHRlbmRzIHVua25vd25bXSwgVj4oXG4gKiAgIGFycjogQSxcbiAqICAgbWFwcGVyOiA8SyBleHRlbmRzIG51bWJlcj4oZWw6IEFbS10sIGlkeDogSywgYXJyOiBBKSA9PiBWLFxuICogKSA9PiBWW119IFR5cGVkTWFwXG4gKi8kaM2PX29uY2UuZnJvbVR5cGVkRW50cmllcyhmcm9tVHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCB0eXBlZE1hcCA9IC8qKiBAdHlwZSB7VHlwZWRNYXB9ICovIChcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUubWFwKVxuKTskaM2PX29uY2UudHlwZWRNYXAodHlwZWRNYXApO1xuXG4gICAgICAgY29uc3QgbG9nTGV2ZWxzID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ2RlYnVnJyxcbiAgJ2xvZycsXG4gICdpbmZvJyxcbiAgJ3dhcm4nLFxuICAnZXJyb3InLFxuXSk7JGjNj19vbmNlLmxvZ0xldmVscyhsb2dMZXZlbHMpO1xuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiogQHR5cGVkZWYgeyh0eXBlb2YgbG9nTGV2ZWxzKVtrZXlvZiBsb2dMZXZlbHMgJiBudW1iZXJdfSBMb2dMZXZlbCAqL1xuXG4vKiogQHR5cGVkZWYge1BpY2s8Q29uc29sZSwgTG9nTGV2ZWw+fSBMaW1pdGVkQ29uc29sZSAqL1xuXG4vKipcbiAqIERlZXAtY29weSBhIHZhbHVlIGJ5IHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2ggSlNPTiAod2hpY2ggZHJvcHNcbiAqIGZ1bmN0aW9uL3N5bWJvbC91bmRlZmluZWQgdmFsdWVzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vbi1lbnVtZXJhYmxlXG4gKiBhbmQvb3Igc3ltYm9sLWtleWVkLCBhbmQgcmVqZWN0cyBiaWdpbnQgdmFsdWVzKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBkZWVwQ29weUpzb25hYmxlID0gdmFsdWUgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIHtzdHJpbmcgJiBrZXlvZiBPfSBLXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPW0tdfSB2YWx1ZVxuICogQHBhcmFtIHtLIHwgdW5kZWZpbmVkfSBuYW1lXG4gKiBAcGFyYW0ge08gfCB1bmRlZmluZWR9IGNvbnRhaW5lclxuICogQHBhcmFtIHsodmFsdWU6IE9bS10sIG5hbWU6IHN0cmluZywgcmVjb3JkOiBPKSA9PiBPW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7T1tLXSB8IE0gfCB7IFtLMiBpbiBrZXlvZiBPW0tdXTogT1tLXVtLMl0gfCBNIH19XG4gKi8kaM2PX29uY2UuZGVlcENvcHlKc29uYWJsZShkZWVwQ29weUpzb25hYmxlKTtcbmNvbnN0IGRlZXBNYXBPYmplY3RJbnRlcm5hbCA9ICh2YWx1ZSwgbmFtZSwgY29udGFpbmVyLCBtYXBwZXIpID0+IHtcbiAgaWYgKGNvbnRhaW5lciAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBtYXBwZWQgPSBtYXBwZXIodmFsdWUsIG5hbWUsIGNvbnRhaW5lcik7XG4gICAgaWYgKG1hcHBlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IHdhc01hcHBlZCA9IGZhbHNlO1xuICBjb25zdCB2YWx1ZU9iaiA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSk7XG4gIC8qKlxuICogQHR5cGUgezxUIGV4dGVuZHMgdHlwZW9mIHZhbHVlLCBLMiBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICBlbnRyeTogW0syLCBUW0syXV0sXG4gKiApID0+IFtLMiwgVFtLMl0gfCBNXX1cbiAqL1xuICBjb25zdCBtYXBFbnRyeSA9IChbaW5uZXJOYW1lLCBpbm5lclZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IG1hcHBlZElubmVyVmFsdWUgPSBkZWVwTWFwT2JqZWN0SW50ZXJuYWwoXG4gICAgICBpbm5lclZhbHVlLFxuICAgICAgaW5uZXJOYW1lLFxuICAgICAgdmFsdWVPYmosXG4gICAgICBtYXBwZXIsXG4gICAgKTtcbiAgICB3YXNNYXBwZWQgfHw9IG1hcHBlZElubmVyVmFsdWUgIT09IGlubmVyVmFsdWU7XG4gICAgcmV0dXJuIFtpbm5lck5hbWUsIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkSW5uZXJWYWx1ZSldO1xuICB9O1xuICBjb25zdCBtYXBwZWRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKHZhbHVlT2JqKS5tYXAobWFwRW50cnkpO1xuXG4gIGlmICghd2FzTWFwcGVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgbWFwcGVkT2JqID0gZnJvbVR5cGVkRW50cmllcyhtYXBwZWRFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkT2JqKTtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdHJhdmVyc2VzIGEgcmVjb3JkIG9iamVjdCBzdHJ1Y3R1cmUsIGNhbGxpbmcgYSBtYXBwZXIgZnVuY3Rpb25cbiAqIGZvciBlYWNoIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHByb3BlcnR5IGFuZCByZXR1cm5pbmcgYSByZWNvcmQgY29tcG9zZWQgb2ZcbiAqIHRoZSByZXN1bHRzLiBJZiBub25lIG9mIHRoZSB2YWx1ZXMgYXJlIGNoYW5nZWQsIHRoZSBvcmlnaW5hbCBvYmplY3QgaXNcbiAqIHJldHVybmVkLCBtYWludGFpbmluZyBpdHMgaWRlbnRpdHkuXG4gKlxuICogV2hlbiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gb2JqZWN0LCBpdCBpcyBzZW50IHRvIHRoZSBtYXBwZXIgbGlrZSBhbnkgb3RoZXJcbiAqIHZhbHVlLCBhbmQgdGhlbiByZWN1cnNpdmVseSB0cmF2ZXJzZWQgdW5sZXNzIHJlcGxhY2VkIHdpdGggYSBkaXN0aW5jdCB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICB2YWx1ZTogVFtLXSxcbiAqICAgbmFtZTogSyxcbiAqICAgcmVjb3JkOiBULFxuICogKSA9PiBUW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7TyB8IHsgW0sgaW4ga2V5b2YgT106IEsgZXh0ZW5kcyBzdHJpbmcgPyBPW0tdIHwgTSA6IG5ldmVyIH19XG4gKi9cbiAgICAgICBjb25zdCBkZWVwTWFwT2JqZWN0ID0gKG9iaiwgbWFwcGVyKSA9PlxuICAvKiogQHR5cGUge2FueX0gKi8gKGRlZXBNYXBPYmplY3RJbnRlcm5hbChvYmosIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtYXBwZXIpKTtcblxuLyoqXG4gKiBFeHBsaWNpdGx5IHNldCBhIGZ1bmN0aW9uJ3MgbmFtZSwgc3VwcG9ydGluZyB1c2Ugb2YgYXJyb3cgZnVuY3Rpb25zIGZvciB3aGljaFxuICogc291cmNlIHRleHQgZG9lc24ndCBpbmNsdWRlIGEgbmFtZSBhbmQgbm8gaW5pdGlhbCBuYW1lIGlzIHNldCBieVxuICogTmFtZWRFdmFsdWF0aW9uXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi9tdWx0aXBhZ2Uvc3ludGF4LWRpcmVjdGVkLW9wZXJhdGlvbnMuaHRtbCNzZWMtcnVudGltZS1zZW1hbnRpY3MtbmFtZWRldmFsdWF0aW9uXG4gKlxuICogYG5hbWVgIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgZm9yIGJldHRlciByZWFkYWJpbGl0eSBhdCBjYWxsIHNpdGVzIChlLmcuLFxuICogYHJldHVybiBkZWZpbmVOYW1lKCdmb28nLCAoKSA9PiB7IC4uLiB9KWApLlxuICpcbiAqIEB0ZW1wbGF0ZSB7RnVuY3Rpb259IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z9IGZuXG4gKiBAcmV0dXJucyB7Rn1cbiAqLyRozY9fb25jZS5kZWVwTWFwT2JqZWN0KGRlZXBNYXBPYmplY3QpO1xuICAgICAgIGNvbnN0IGRlZmluZU5hbWUgPSAobmFtZSwgZm4pID0+XG4gIGRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5XG4gKiB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSwgYG9iamVjdE1hcE11dGFibGVgXG4gKiB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgZW51bWVyYWJsZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVW5saWtlIGVuZG8ncyBgb2JqZWN0TWFwYCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLWhhcmRlbmVkIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PEsgZXh0ZW5kcyBrZXlvZiBPPih2YWx1ZTogT1tLXSwga2V5OiBLKSA9PiBNfSBtYXBwZXJcbiAqIEByZXR1cm5zIHt7IFtLIGluIGtleW9mIE9dOiBLIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIH19XG4gKi8kaM2PX29uY2UuZGVmaW5lTmFtZShkZWZpbmVOYW1lKTtcbiAgICAgICBjb25zdCBvYmplY3RNYXBNdXRhYmxlID0gKG9iaiwgbWFwcGVyKSA9PiB7XG4gIGNvbnN0IG9sZEVudHJpZXMgPSB0eXBlZEVudHJpZXMob2JqKTtcbiAgLyoqIEB0eXBlIHs8SyBleHRlbmRzIGtleW9mIE8+KGVudHJ5OiBbSywgT1tLXV0pID0+IFtLLCBNXX0gKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2ssIHZdKSA9PiBbaywgbWFwcGVyKHYsIGspXTtcbiAgY29uc3QgbmV3RW50cmllcyA9IHR5cGVkTWFwKG9sZEVudHJpZXMsIG1hcEVudHJ5KTtcbiAgY29uc3QgbmV3T2JqID0gZnJvbVR5cGVkRW50cmllcyhuZXdFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobmV3T2JqKTtcbn07XG5cbi8qKlxuICogTWFwIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBuZXcgdmFsdWVzLCBza2lwcGluZyBlbGVtZW50cyBmb3Igd2hpY2ggdGhlXG4gKiBtYXBwaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGB1bmRlZmluZWRgIG9yIGBmYWxzZWAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0ge1RbXX0gYXJyXG4gKiBAcGFyYW0geyh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyOiBUW10pID0+IFUgfCB1bmRlZmluZWQgfCBmYWxzZX0gbWFwT3JEcm9wXG4gKiBAcmV0dXJucyB7VVtdfVxuICovJGjNj19vbmNlLm9iamVjdE1hcE11dGFibGUob2JqZWN0TWFwTXV0YWJsZSk7XG4gICAgICAgY29uc3QgcGFydGlhbE1hcCA9IChhcnIsIG1hcE9yRHJvcCkgPT5cbiAgYXJyLnJlZHVjZSgocmVzdWx0cywgZWwsIGksIGFyckFyZykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG1hcE9yRHJvcChlbCwgaSwgYXJyQXJnKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9LCAvKiogQHR5cGUge1VbXX0gKi8gKFtdKSk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSB2YWx1ZSBmcm9tIGBtYXBgIGFzc29jaWF0ZWQgd2l0aCBga2V5YC4gSWYgdGhlcmUgaXMgbm90IHlldCBzdWNoIGFcbiAqIHZhbHVlLCBnZXQgb25lIGZyb20gYG1ha2VWYWx1ZShrZXkpYCBhbmQgdXBkYXRlIGBtYXBgIGJlZm9yZSByZXR1cm5pbmcgdGhlXG4gKiBuZXcgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1tLXSBleHRlbmRzIFtXZWFrS2V5XSA/IFdlYWtNYXA8SywgVj4gOiBNYXA8SywgVj59IG1hcFxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqLyRozY9fb25jZS5wYXJ0aWFsTWFwKHBhcnRpYWxNYXApO1xuICAgICAgIGNvbnN0IHByb3ZpZGVMYXp5TWFwID0gKG1hcCwga2V5LCBtYWtlVmFsdWUpID0+IHtcbiAgY29uc3QgZm91bmQgPSBtYXAuZ2V0KGtleSk7XG4gIGlmIChmb3VuZCAhPT0gdW5kZWZpbmVkIHx8IG1hcC5oYXMoa2V5KSkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1Z9ICovIChmb3VuZCk7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBtYWtlVmFsdWUoa2V5KTtcbiAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgY3VycmVudC10aW1lIGNhcGFiaWxpdHlcbiAqIChzdWNoIGFzIGBwZXJmb3JtYW5jZS5ub3dgKSB0byBtZWFzdXJlIGV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBhbiBhc3luY1xuICogZnVuY3Rpb24gYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0geygpID0+IG51bWJlcn0gY3VycmVudFRpbWVNaWxsaXNlY1xuICovJGjNj19vbmNlLnByb3ZpZGVMYXp5TWFwKHByb3ZpZGVMYXp5TWFwKTtcbiAgICAgICBjb25zdCBtYWtlTWVhc3VyZVNlY29uZHMgPSBjdXJyZW50VGltZU1pbGxpc2VjID0+IHtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHJldHVybnMge1Byb21pc2U8eyByZXN1bHQ6IFQ7IGR1cmF0aW9uOiBudW1iZXIgfT59XG4gKi9cbiAgY29uc3QgbWVhc3VyZVNlY29uZHMgPSBhc3luYyBmbiA9PiB7XG4gICAgY29uc3QgdDAgPSBjdXJyZW50VGltZU1pbGxpc2VjKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICBjb25zdCBkdXJhdGlvbk1pbGxpc2VjID0gY3VycmVudFRpbWVNaWxsaXNlYygpIC0gdDA7XG4gICAgcmV0dXJuIHsgcmVzdWx0LCBkdXJhdGlvbjogZHVyYXRpb25NaWxsaXNlYyAvIDEwMDAgfTtcbiAgfTtcbiAgcmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xufTtcblxuLyoqXG4gKiBGaW5kIGFsbCBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBwcmVmaXgsIGFuZFxuICogcmV0dXJuIGEgbmV3IG9iamVjdCBjb25zaXN0aW5nIG9mIHRob3NlIHByb3BlcnRpZXMgd2l0aG91dCB0aGF0IHByZWZpeC5cbiAqIFVzZWZ1bCBmb3IgZmlsdGVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgcHVycG9zZS5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUFxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1JlY29yZDxgJHtQfSR7S31gLCBWPn0gb2JqXG4gKiBAcGFyYW0ge1B9IHByZWZpeFxuICovJGjNj19vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuICAgICAgIGNvbnN0IHVucHJlZml4ZWRQcm9wZXJ0aWVzID0gKG9iaiwgcHJlZml4KSA9PlxuICAvKiogQHR5cGUge1JlY29yZDxLLCBWPn0gKi8gKFxuICAgIGZyb21UeXBlZEVudHJpZXMoXG4gICAgICB0eXBlZEVudHJpZXMob2JqKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpLCB2YWx1ZV0pLFxuICAgIClcbiAgKTskaM2PX29uY2UudW5wcmVmaXhlZFByb3BlcnRpZXModW5wcmVmaXhlZFByb3BlcnRpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVFJVRSI6WyJUUlVFIl0sInR5cGVkRW50cmllcyI6WyJ0eXBlZEVudHJpZXMiXSwiZnJvbVR5cGVkRW50cmllcyI6WyJmcm9tVHlwZWRFbnRyaWVzIl0sInR5cGVkTWFwIjpbInR5cGVkTWFwIl0sImxvZ0xldmVscyI6WyJsb2dMZXZlbHMiXSwiZGVlcENvcHlKc29uYWJsZSI6WyJkZWVwQ29weUpzb25hYmxlIl0sImRlZXBNYXBPYmplY3QiOlsiZGVlcE1hcE9iamVjdCJdLCJkZWZpbmVOYW1lIjpbImRlZmluZU5hbWUiXSwib2JqZWN0TWFwTXV0YWJsZSI6WyJvYmplY3RNYXBNdXRhYmxlIl0sInBhcnRpYWxNYXAiOlsicGFydGlhbE1hcCJdLCJwcm92aWRlTGF6eU1hcCI6WyJwcm92aWRlTGF6eU1hcCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sInVucHJlZml4ZWRQcm9wZXJ0aWVzIjpbInVucHJlZml4ZWRQcm9wZXJ0aWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACL1UtWsBwAArAcAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJrZXlNaXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuY29uc3QgeyBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ICYgUmVjb3JkPEV4Y2x1ZGU8UHJvcGVydHlLZXksIHN0cmluZz4sIG5ldmVyPn0gSW5pdFxuICogQHR5cGVkZWYge3sgcmVhZG9ubHkgW0sgaW4ga2V5b2YgSW5pdF06IEsgfX0gS2V5TWlycm9yUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBNaXJyb3IgdGhlIGtleXMgb2YgYW4gb2JqZWN0IHRvIHN0cmluZyB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUga2V5IG5hbWVzLiBUaGlzXG4gKiB3b3JrcyB3ZWxsIHRvIGRlZmluZSBhIFR5cGVTY3JpcHQgZW51bSB0eXBlIGNvbXBhdGlibGUgd2l0aCBlcmFzYWJsZSBzeW50YXg6XG4gKlxuICogICAgYEBlbnVtIHsodHlwZW9mIE15RW51bSlba2V5b2YgdHlwZW9mIE15RW51bV19YFxuICpcbiAqIFRoZSBwcm92aWRlZCByZWNvcmQgbXVzdCBvbmx5IG1hcCBwcm9wZXJ0eSBuYW1lcyB0byBlaXRoZXIgYG51bGxgIG9yIHRoZVxuICogcHJvcGVydHkgbmFtZSBpdHNlbGYuIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIGlkZW50aWNhbCBrZXlzIHdob3NlIHZhbHVlcyBhcmVcbiAqIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUga2V5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gJiBSZWNvcmQ8RXhjbHVkZTxQcm9wZXJ0eUtleSwgc3RyaW5nPiwgbmV2ZXI+fSBJbml0XG4gKiBAcGFyYW0ge0luaXQgJiB7IHJlYWRvbmx5IFtLIGluIGtleW9mIEluaXRdOiBJbml0W0tdIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBLIH19IHJlY29yZFxuICogQHJldHVybnMge0tleU1pcnJvclJlc3VsdDxJbml0Pn1cbiAqL1xuICAgICAgIGNvbnN0IGtleU1pcnJvciA9IHJlY29yZCA9PiB7XG4gIGlmIChyZWNvcmQgPT09IG51bGwgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2tleU1pcnJvciBleHBlY3RzIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzLicpO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBtaXJyb3JlZCA9IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFJlY29yZCBjb25mdXNlZCBieSBudWxsIHByb3RvdHlwZSovXG4gICAgX19wcm90b19fOiBudWxsLFxuICB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKHJlY29yZCkpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IGtleSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgICBgVmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIG11c3QgYmUgbnVsbCBvciB0aGUga2V5IHN0cmluZzsgZ290ICR7U3RyaW5nKHZhbHVlKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIG1pcnJvcmVkW2tleV0gPSBrZXk7XG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7S2V5TWlycm9yUmVzdWx0PEluaXQ+fSAqLyAoZnJlZXplKG1pcnJvcmVkKSk7XG59OyRozY9fb25jZS5rZXlNaXJyb3Ioa2V5TWlycm9yKTtcblxuZnJlZXplKGtleU1pcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJrZXlNaXJyb3IiOlsia2V5TWlycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiLCIuL2NhbGxiYWNrLmpzIl0sImV4cG9ydHMiOlsiU3RyZWFtQ2VsbFNoYXBlIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLEZhcixNLG1ha2VIZWFwWm9uZSxjYjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vY2FsbGJhY2suanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjYiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCduYW1lJyx7dmFsdWU6XCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaM2PX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtNYXJzaGFsLCBQYXNzYWJsZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtSZW1vdGUsIEVSZW1vdGUsIFR5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnLi9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtDYWxsYmFja30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEB0eXBlZGVmIHtNYXJzaGFsPHVua25vd24+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIHdyaXRlIG9mIGB2YWx1ZXNgXG4gKiAgIChkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXIpXG4gKiBAcHJvcGVydHkge1RbXX0gdmFsdWVzXG4gKi9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48U3RyZWFtQ2VsbD59ICovXG4gICAgICAgY29uc3QgU3RyZWFtQ2VsbFNoYXBlID0gaGFyZGVuKHtcbiAgYmxvY2tIZWlnaHQ6IE0uc3RyaW5nKCksXG4gIHZhbHVlczogTS5hcnJheSgpLFxufSk7XG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3NcbiAqIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhc1xuICogICBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoXG4gKiAgIHN1YlBhdGg6IHN0cmluZyxcbiAqICAgb3B0aW9ucz86IHsgc2VxdWVuY2U/OiBib29sZWFuIH0sXG4gKiApID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi8kaM2PX29uY2UuU3RyZWFtQ2VsbFNoYXBlKFN0cmVhbUNlbGxTaGFwZSk7XG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJID0gTS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJywge1xuICBzZXRWYWx1ZTogTS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG4gIGdldFBhdGg6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldFN0b3JlS2V5OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbiAgbWFrZUNoaWxkTm9kZTogTS5jYWxsKE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0uc3BsaXRSZWNvcmQoe30sIHsgc2VxdWVuY2U6IE0uYm9vbGVhbigpIH0sIHt9KSlcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKSksXG59KTtcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuIEF0IHRpbWUgb2Ygd3JpdGluZywgbm8gbGVnYWN5IGNlbGxzIGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYVxuICogc3RyZWFtIGNlbGwsIGFuZCB3ZSBkbyBub3QgaW50ZW5kIHRvIGNyZWF0ZSBhbnkgbW9yZSBsZWdhY3kgdmFsdWUgY2VsbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IGNlbGxcbiAqIEByZXR1cm5zIHtjZWxsIGlzIFN0cmVhbUNlbGx9XG4gKi9cbiAgICAgICBjb25zdCBpc1N0cmVhbUNlbGwgPSBjZWxsID0+XG4gIGNlbGwgJiZcbiAgdHlwZW9mIGNlbGwgPT09ICdvYmplY3QnICYmXG4gIEFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZXMpICYmXG4gIHR5cGVvZiBjZWxsLmJsb2NrSGVpZ2h0ID09PSAnc3RyaW5nJyAmJlxuICAvXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjNj19vbmNlLmlzU3RyZWFtQ2VsbChpc1N0cmVhbUNlbGwpO1xuaGFyZGVuKGlzU3RyZWFtQ2VsbCk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlXG4gKiAgIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGVcbiAqICAgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbi8qIFNob3VsZCByZW1haW4gY29uc2lzdGVudCB3aXRoIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS90eXBlcy9wYXRoX2tleXMuZ28qL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuID0gL15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcpID0+IHZvaWR9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGF0aFNlZ21lbnQgPSBuYW1lID0+IHtcbiAgcGF0aFNlZ21lbnRQYXR0ZXJuLnRlc3QobmFtZSkgfHxcbiAgICBGYWlsYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbn07JGjNj19vbmNlLmFzc2VydFBhdGhTZWdtZW50KGFzc2VydFBhdGhTZWdtZW50KTtcbmhhcmRlbihhc3NlcnRQYXRoU2VnbWVudCk7XG5cbi8qKlxuICogTXVzdCBtYXRjaCB0aGUgc3dpdGNoIGluIHZzdG9yYWdlLmdvIHVzaW5nIGB2c3RvcmFnZU1lc3NhZ2VgIHR5cGVcbiAqXG4gKiBAdHlwZWRlZiB7J2dldCdcbiAqICAgfCAnZ2V0U3RvcmVLZXknXG4gKiAgIHwgJ2hhcydcbiAqICAgfCAnY2hpbGRyZW4nXG4gKiAgIHwgJ2VudHJpZXMnXG4gKiAgIHwgJ3ZhbHVlcydcbiAqICAgfCAnc2l6ZSd9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKlxuICpcbiAqIEB0eXBlZGVmIHsnc2V0JyB8ICdzZXRXaXRob3V0Tm90aWZ5JyB8ICdhcHBlbmQnfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqXG4gKlxuICogQHR5cGVkZWYge1N0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiAgIHwgU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kfSBTdG9yYWdlTWVzc2FnZU1ldGhvZFxuICpcbiAqXG4gKiBAdHlwZWRlZiB7W3BhdGg6IHN0cmluZ119IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJnc1xuICpcbiAqIEB0eXBlZGVmIHtbcGF0aDogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyB8IG51bGxdfSBTdG9yYWdlRW50cnlcbiAqXG4gKiBAdHlwZWRlZiB7U3RvcmFnZUVudHJ5W119IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3NcbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZDtcbiAqICAgICAgIGFyZ3M6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJncztcbiAqICAgICB9XG4gKiAgIHwge1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgICAgICBhcmdzOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzO1xuICogICAgIH19IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlID0gem9uZSA9PiB7XG4gIC8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtDYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlciBhIGNhbGxiYWNrXG4gKiAgIGZvciBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlc1xuICogICByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlcyBzbyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBlbXBsb3lzIGFcbiAqICAgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXQgcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jay5cbiAqICAgQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG4gIGNvbnN0IG1ha2VDaGFpblN0b3JhZ2VOb2RlID0gem9uZS5leG9DbGFzcyhcbiAgICAnQ2hhaW5TdG9yYWdlTm9kZScsXG4gICAgQ2hhaW5TdG9yYWdlTm9kZUksXG4gICAgLyoqXG4gKiBAcGFyYW0ge0NhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuICAgIChtZXNzZW5nZXIsIHBhdGgsIHsgc2VxdWVuY2UgPSBmYWxzZSB9ID0ge30pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocGF0aCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwgJ2Jvb2xlYW4nKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBwYXRoLCBtZXNzZW5nZXIsIHNlcXVlbmNlIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIEBkZXByZWNhdGVkIHVzZSBnZXRQYXRoXG4gKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59XG4gKi9cbiAgICAgIGFzeW5jIGdldFN0b3JlS2V5KCkge1xuICAgICAgICBjb25zdCB7IHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogJ2dldFN0b3JlS2V5JyxcbiAgICAgICAgICBhcmdzOiBbcGF0aF0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogQHR5cGUgeyhcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjaGlsZE5vZGVPcHRpb25zPzogeyBzZXF1ZW5jZT86IGJvb2xlYW4gfSxcbiAqICkgPT4gU3RvcmFnZU5vZGV9XG4gKi9cbiAgICAgIG1ha2VDaGlsZE5vZGUobmFtZSwgY2hpbGROb2RlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IHNlcXVlbmNlLCAuLi5jaGlsZE5vZGVPcHRpb25zIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbiAgICAgICAgICBtZXNzZW5nZXIsXG4gICAgICAgICAgYCR7cGF0aH0uJHtuYW1lfWAsXG4gICAgICAgICAgbWVyZ2VkT3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAvKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBzZXF1ZW5jZSwgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICAgIC8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xuICAgICAgICBsZXQgZW50cnk7XG4gICAgICAgIGlmICghc2VxdWVuY2UgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogc2VxdWVuY2UgPyAnYXBwZW5kJyA6ICdzZXQnLFxuICAgICAgICAgIGFyZ3M6IFtlbnRyeV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuICAgICAgLyogKiBnZXRWYWx1ZSgpKi9cbiAgICAgIC8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbiAgICAgIC8qICogZ2V0TmFtZSgpKi9cbiAgICAgIC8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4gICAgICAvKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuICAgICAgLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL1xuICAgIH0sXG4gICk7XG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZTtcbn07JGjNj19vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlID0gcHJlcGFyZUNoYWluU3RvcmFnZU5vZGUobWFrZUhlYXBab25lKCkpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGhlYXAtYmFzZWQgcm9vdCBzdG9yYWdlIG5vZGUgZm9yIGEgZ2l2ZW4gYmFja2luZyBmdW5jdGlvbiBhbmQgcm9vdFxuICogcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogICBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW3Jvb3RPcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbcm9vdE9wdGlvbnMuc2VxdWVuY2VdIGVtcGxveSBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiAgIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzIHRvXG4gKiAgIGRvIHRoZSBzYW1lXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG4gIHJvb3RQYXRoLFxuICByb290T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lc3NlbmdlciA9IGNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuICAvKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG4gIGNvbnN0IHJvb3ROb2RlID0gbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlKG1lc3Nlbmdlciwgcm9vdFBhdGgsIHJvb3RPcHRpb25zKTtcbiAgcmV0dXJuIHJvb3ROb2RlO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX0gYW4gb2JqZWN0IHRoYXQgY29uZmlybXMgdG8gU3RvcmFnZU5vZGUgQVBJIGJ1dCBkb2VzXG4gKiAgIG5vdCBzdG9yZSBhbnl3aGVyZS5cbiAqL1xuY29uc3QgbWFrZU51bGxTdG9yYWdlTm9kZSA9ICgpID0+IHtcbiAgLyogWFhYIHJlLXVzZSBcIkNoYWluU3RvcmFnZVwiIG1ldGhvZHMgYWJvdmUgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZGVwZW5kIG9uIGNoYWlucyovXG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgICBGYXIoJ051bGxNZXNzZW5nZXInLCAoKSA9PiBudWxsKSxcbiAgICAnbnVsbCcsXG4gICk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgYSBzdG9yYWdlIG5vZGUgYXQgb3IgdW5kZXIgaXRzIGlucHV0LFxuICogZmFsbGluZyBiYWNrIHRvIGFuIGluZXJ0IG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSAoYnV0IGluY29tcGxldGVcbiAqIGJlaGF2aW9yKSB3aGVuIHRoYXQgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPFJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsPn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlbW90ZTxTdG9yYWdlTm9kZT4+fVxuICovXG4gICAgICAgYXN5bmMgZnVuY3Rpb24gbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsIGNoaWxkTmFtZSkge1xuICBjb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlID0gYXdhaXQgc3RvcmFnZU5vZGVSZWY7XG4gIGNvbnN0IHN0b3JhZ2VOb2RlID0gZXhpc3RpbmdTdG9yYWdlTm9kZSB8fCBtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG4gIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG59XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHsodmFsdWU6IFBhc3NhYmxlKSA9PiBQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICByZXR1cm4gYXN5bmMgdmFsdWUgPT4ge1xuICAgIGNvbnN0IG1hcnNoYWxsZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xuICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdHJlYW1DZWxsU2hhcGUiOlsiU3RyZWFtQ2VsbFNoYXBlIl0sImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACNFcvqnAwAApwMAADcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VJbmFjY2Vzc2libGVWYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgaWZhY2VBbGxlZ2VkUHJlZml4ID0gJ0FsbGVnZWQ6ICc7XG5jb25zdCBpZmFjZUluYWNjZXNzaWJsZVByZWZpeCA9ICdTRVZFUkVEOiAnO1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gaWZhY2VcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSW5hY2Nlc3NpYmxlVmFsID0gaWZhY2UgPT4ge1xuICBpZiAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyAmJiBpZmFjZS5zdGFydHNXaXRoKGlmYWNlQWxsZWdlZFByZWZpeCkpIHtcbiAgICBpZmFjZSA9IGlmYWNlLnNsaWNlKGlmYWNlQWxsZWdlZFByZWZpeC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBGYXIoYCR7aWZhY2VJbmFjY2Vzc2libGVQcmVmaXh9JHtpZmFjZX1gLCB7fSk7XG59OyRozY9fb25jZS5tYWtlSW5hY2Nlc3NpYmxlVmFsKG1ha2VJbmFjY2Vzc2libGVWYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUluYWNjZXNzaWJsZVZhbCI6WyJtYWtlSW5hY2Nlc3NpYmxlVmFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKSDz56xAwAAsQMAADAAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInB1cmVEYXRhTWFyc2hhbGxlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NhcERhdGF9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKiBAcGFyYW0ge0NhcERhdGE8dW5rbm93bj59IGNhcCAqL1xuY29uc3QgcmVqZWN0T0NhcCA9IGNhcCA9PiBGYWlsYCR7Y2FwfSBpcyBub3QgcHVyZSBkYXRhYDtcbiAgICAgICBjb25zdCBwdXJlRGF0YU1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChyZWplY3RPQ2FwLCByZWplY3RPQ2FwLCB7XG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxufSk7JGjNj19vbmNlLnB1cmVEYXRhTWFyc2hhbGxlcihwdXJlRGF0YU1hcnNoYWxsZXIpO1xuaGFyZGVuKHB1cmVEYXRhTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdXJlRGF0YU1hcnNoYWxsZXIiOlsicHVyZURhdGFNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANZdM97lPAAA5TwAADYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vY2FjaGUtbWFwIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL2ZhciIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi9pbmFjY2Vzc2libGUtdmFsLmpzIl0sImV4cG9ydHMiOlsid3JhcFJlbW90ZU1hcnNoYWxsZXIiLCJ3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQiLCJ3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlQ2FjaGVNYXBLaXQsRmFpbCxxLEUsRmFyLFBBU1NfU1RZTEUsbWFrZU1hcnNoYWwsbWFrZUluYWNjZXNzaWJsZVZhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NhY2hlLW1hcFwiLCBbW1wibWFrZUNhY2hlTWFwS2l0XCIsWyRozY9fYSA9PiAobWFrZUNhY2hlTWFwS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCIuL2luYWNjZXNzaWJsZS12YWwuanNcIiwgW1tcIm1ha2VJbmFjY2Vzc2libGVWYWxcIixbJGjNj19hID0+IChtYWtlSW5hY2Nlc3NpYmxlVmFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1dlYWtNYXBBUEl9IGZyb20gJ0BlbmRvL2NhY2hlLW1hcCc7XG4gKiBAaW1wb3J0IHtFT25seX0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCc7XG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVkLCBTaW1wbGlmeX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtDYXBEYXRhLCBQYXNzYWJsZSwgTWFyc2hhbCwgTWFrZU1hcnNoYWxPcHRpb25zfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEEgTWFyc2hhbGxlciB3aGljaCBtZXRob2RzIG1heSBiZSBhc3luYy4gVXNlIHRoaXMgdHlwZSB0byBpbmRpY2F0ZSBhY2NlcHRpbmdcbiAqIGVpdGhlciBhIHN5bmMgb3IgYXN5bmMgbWFyc2hhbGxlciwgdXN1YWxseSB0aHJvdWdoIGBFYCBldmVudHVhbC1zZW5kcy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIHtTaW1wbGlmeTxFT25seTxNYXJzaGFsPFNsb3Q+Pj59IEVNYXJzaGFsbGVyXG4gKi9cblxuLyoqIEB0eXBlZGVmIHsnUmVtb3RhYmxlJyB8IGBBbGxlZ2VkOiAke3N0cmluZ31gfSBJbnRlcmZhY2VTcGVjICovXG5cbi8qKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl0gKi9cbmNsYXNzIFNsb3RXcmFwcGVyIHtcbiAgLyoqIEB0eXBlIHtTbG90fSAqL1xuICAjc2xvdDtcblxuICAvKiogQHR5cGUge0ludGVyZmFjZVNwZWN9ICovXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gJ0FsbGVnZWQ6IFNsb3RXcmFwcGVyJztcblxuICAvKipcbiAqIEBwYXJhbSB7U2xvdH0gc2xvdFxuICogQHBhcmFtIHtzdHJpbmd9IFtpZmFjZV1cbiAqL1xuICBjb25zdHJ1Y3RvcihzbG90LCBpZmFjZSkge1xuICAgIGlmIChpZmFjZSA9PSBudWxsIHx8IGlmYWNlID09PSAnUmVtb3RhYmxlJykge1xuICAgICAgaWZhY2UgPSAnUmVtb3RhYmxlJztcbiAgICB9IGVsc2UgaWYgKCFpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSkge1xuICAgICAgaWZhY2UgPSBgQWxsZWdlZDogJHtpZmFjZX1gO1xuICAgIH1cbiAgICB0aGlzLiNzbG90ID0gc2xvdDtcbiAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAvKiogQHR5cGUge0ludGVyZmFjZVNwZWN9ICovIChpZmFjZSk7XG4gIH1cblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHBhcmFtIHtTbG90V3JhcHBlcjxTbG90Pn0gd3JhcHBlclxuICogQHJldHVybnMge1Nsb3R9XG4gKi9cbiAgc3RhdGljIGdldFNsb3Qod3JhcHBlcikge1xuICAgIHJldHVybiB3cmFwcGVyLiNzbG90O1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhTbG90V3JhcHBlci5wcm90b3R5cGUsIHtcbiAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogJ0FsbGVnZWQ6IFNsb3RXcmFwcGVyJyB9LFxufSk7XG5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KFNsb3RXcmFwcGVyLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJyk7XG5oYXJkZW4oU2xvdFdyYXBwZXIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHR5cGVkZWYge1Nsb3RXcmFwcGVyPFNsb3Q+ICYgUGFzc1N0eWxlZDwncmVtb3RhYmxlJywgSW50ZXJmYWNlU3BlYz59IFJlbW90YWJsZVNsb3RXcmFwcGVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7U2xvdH0gc2xvdFxuICogQHBhcmFtIHtzdHJpbmd9IFtpZmFjZV1cbiAqL1xuY29uc3Qgc2xvdFRvV3JhcHBlciA9IChzbG90LCBpZmFjZSkgPT5cbiAgLyoqIEB0eXBlIHtSZW1vdGFibGVTbG90V3JhcHBlcjxTbG90Pn0gKi8gKFxuICAgIGhhcmRlbihuZXcgU2xvdFdyYXBwZXIoc2xvdCwgaWZhY2UpKVxuICApO1xuXG5jb25zdCB3cmFwcGVyVG9TbG90ID0gU2xvdFdyYXBwZXIuZ2V0U2xvdDtcblxuY29uc3QgY2FwYWNpdHlPZkRlZmF1bHRDYWNoZSA9IDUwO1xuXG4vKiBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMTIxMTEpKi9cbi8qIENoZWNrIGNvc3Qgb2YgdXNpbmcgdmlydHVhbC1hd2FyZSBXZWFrTWFwIGluIGxpdmVzbG90cyovXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtib29sZWFufSBbd2Vha0tleV1cbiAqL1xuY29uc3QgbWFrZURlZmF1bHRDYWNoZU1hcCA9IHdlYWtLZXkgPT5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+fSAqLyAoXG4gICAgbWFrZUNhY2hlTWFwS2l0KGNhcGFjaXR5T2ZEZWZhdWx0Q2FjaGUsIHtcbiAgICAgIG1ha2VNYXA6IHdlYWtLZXkgPyBXZWFrTWFwIDogTWFwLFxuICAgIH0pLmNhY2hlXG4gICk7XG5cbi8qKlxuICogV3JhcHMgYSBtYXJzaGFsbGVyLCBlaXRoZXIgc3luYyBvciBhc3luYywgbG9jYWwgb3IgcmVtb3RlLCBpbnRvIGEgbG9jYWwgYXN5bmNcbiAqIG1hcnNoYWxsZXIgd2hpY2ggb25seSBzZW5kcyBzbG90cyBmb3IgcmVzb2x1dGlvbiB0byB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyLlxuICogT3B0aW9uYWxseSBhbmQgYnkgZGVmYXVsdCwgY2FjaGVzIHRoZSByZXNvbHV0aW9uIG9mIHNsb3RzLlxuICpcbiAqIEFzc3VtZXMgdGhhdCBhIG51bGwtaXNoIHNsb3QgdmFsdWUgaXMgYSBzZXZlcmVkIHByZXNlbmNlIHRoYXQgY2FuIGJlIHJlc29sdmVkXG4gKiBsb2NhbGx5LiBCeSBkZWZhdWx0IGlmIGEgcHJlc2VuY2UgaXMgbWFwcGVkIHRvIGEgbnVsbC1pc2ggc2xvdCBieSB0aGUgd3JhcHBlZFxuICogbWFyc2hhbGxlciwgdGhhdCBtYXBwaW5nIGlzIG5vdCBjYWNoZWQsIGFsbG93aW5nIHRoZSB3cmFwcGVkIG1hcnNoYWxsZXIgdG9cbiAqIGNyZWF0ZSBhIG1hcHBpbmcgaW4gdGhlIGZ1dHVyZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxQaWNrPEVNYXJzaGFsbGVyPFNsb3Q+LCAnZnJvbUNhcERhdGEnIHwgJ3RvQ2FwRGF0YSc+Pn0gbWFyc2hhbGxlclxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IFttYXJzaGFsT3B0aW9uc11cbiAqIEBwYXJhbSB7b2JqZWN0fSBbY2FjaGVzXVxuICogQHBhcmFtIHtXZWFrTWFwQVBJPG9iamVjdCwgU2xvdD4gfCBudWxsfSBbY2FjaGVzLnZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7V2Vha01hcEFQSTxTbG90LCBvYmplY3Q+IHwgbnVsbH0gW2NhY2hlcy5zbG90VG9WYWxdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjYWNoZXMuY2FjaGVTZXZlcmVkVmFsXVxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEZhcjxFTWFyc2hhbGxlcjxTbG90Pj4+fVxuICovXG4gICAgICAgY29uc3Qgd3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5ID0gKFxuICBtYXJzaGFsbGVyLFxuICB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdzbWFsbGNhcHMnLFxuICAgIGVycm9yVGFnZ2luZyA9ICdvZmYnLCAvKiBEaXNhYmxlIGVycm9yIHRhZ2dpbmcgYnkgZGVmYXVsdCovXG4gICAgLi4ub3RoZXJNYXJzaGFsT3B0aW9uc1xuICB9ID0ge30sXG4gIHtcbiAgICB2YWxUb1Nsb3QgPSBtYWtlRGVmYXVsdENhY2hlTWFwKHRydWUpLFxuICAgIHNsb3RUb1ZhbCA9IG1ha2VEZWZhdWx0Q2FjaGVNYXAoZmFsc2UpLFxuICAgIGNhY2hlU2V2ZXJlZFZhbCA9IGZhbHNlLFxuICB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgbWFyc2hhbE9wdGlvbnMgPSBoYXJkZW4oe1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQsXG4gICAgZXJyb3JUYWdnaW5nLFxuICAgIC4uLm90aGVyTWFyc2hhbE9wdGlvbnMsXG4gIH0pO1xuICAvKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB3cmFwcGVkIG1hcnNoYWxsZXIgaW50ZXJuYWxseSB1c2VzIDIgbWFyc2hhbGxlcnMqL1xuICAvKiB0byB0cmFuc2Zvcm0gdGhlIENhcERhdGEgaW50byBhIFBhc3NhYmxlIHN0cnVjdHVyZSBhbmQgdmljZS12ZXJzYToqL1xuICAvKiAtIEEgY2FwIHBhc3MtdGhyb3VnaCBtYXJzaGFsbGVyIHdoaWNoIHBsYWNlcyBjYXBhYmlsaXRpZXMgYXMtaXMgaW4gdGhlIHNsb3RzLiovXG4gIC8qIFdoZW4gdW5zZXJpYWxpemluZyBDYXBEYXRhIHdpdGggbnVsbC1pc2ggc2xvdHMsIGEgc2V2ZXJlZCBwcmVzZW5jZSBpcyBjcmVhdGVkLiovXG4gIC8qIFRoaXMgcGFzcy10aHJvdWdoIG1hcnNoYWxsZXIgaXMgdXNlZCB0byBsb2NhbGx5IHByb2Nlc3MgdGhlIHN0cnVjdHVyZSwgYW5kKi9cbiAgLyogc2VwYXJhdGUgY2FwYWJpbGl0aWVzIGludG8gYSBzbG90cyBhcnJheSBmb3IgcG90ZW50aWFsIHJlc29sdXRpb24gYnkgdGhlKi9cbiAgLyogd3JhcHBlZCBtYXJzaGFsbGVyLiovXG4gIC8qIC0gQSBcIlNsb3RXcmFwcGVyXCIgbWFyc2hhbGxlciB1c2VkIHRvIHdyYXAgaW50byByZW1vdGFibGVzIHRoZSBzbG90cyBvZiB0aGUqL1xuICAvKiB3cmFwcGVkIG1hcnNoYWxsZXIuIFdoZW4gdW5zZXJpYWxpemluZyBDYXBEYXRhLCBpdCBpcyB1c2VkIHRvIHJlY3JlYXRlKi9cbiAgLyogQ2FwRGF0YSBvZiBhIHNpbXBsZSBhcnJheSBvZiBub24tc2V2ZXJlZCBjYXBhYmlsaXRpZXMgZm9yIHJlc29sdXRpb24gYnkqL1xuICAvKiB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyLiBXaGVuIHNlcmlhbGl6aW5nIHRvIENhcERhdGEsIGl0IGFsbG93cyBleHRyYWN0aW5nKi9cbiAgLyogdGhlIHNsb3RzIGZyb20gdGhlIGNhcGFiaWxpdGllcyBhcnJheSBzZXJpYWxpemVkIGJ5IHRoZSB3cmFwcGVkIG1hcnNoYWxsZXIuKi9cblxuICAvKiogQHR5cGUge01hcnNoYWw8b2JqZWN0IHwgbnVsbD59ICovXG4gIGNvbnN0IHBhc3NUaHJvdWdoTWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKFxuICAgIHVuZGVmaW5lZCxcbiAgICAoc2xvdCwgaWZhY2UpID0+IHNsb3QgPz8gbWFrZUluYWNjZXNzaWJsZVZhbChpZmFjZSksXG4gICAgbWFyc2hhbE9wdGlvbnMsXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtNYXA8U2xvdCwgUmVtb3RhYmxlU2xvdFdyYXBwZXI8Tm9uTnVsbGFibGU8U2xvdD4+Pn0gKi9cbiAgY29uc3QgY3VycmVudFNsb3RUb1dyYXBwZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgY29udmVydFdyYXBwZXJUb1Nsb3QgPSAvKiogQHR5cGUge3R5cGVvZiB3cmFwcGVyVG9TbG90PFNsb3Q+fSAqLyAoXG4gICAgd3JhcHBlclRvU2xvdFxuICApO1xuICAvKipcbiAqIEBwYXJhbSB7U2xvdH0gc2xvdFxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtpZmFjZV1cbiAqL1xuICBjb25zdCBjb252ZXJ0U2xvdFRvV3JhcHBlciA9IChzbG90LCBpZmFjZSkgPT4ge1xuICAgIGlmIChzbG90ID09IG51bGwpIHtcbiAgICAgIC8qIFRoZSB3cmFwcGVkIG1hcnNoYWxsZXIgbWF5IHNlbmQgdXMgQ2FwRGF0YSB3aXRoIGEgbnVsbCBzbG90LiBUaGVzZSBhcmUgbm90Ki9cbiAgICAgIC8qIG1lYW50IHRvIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB3aXRoIGVhY2ggb3RoZXIsIHNvIGJ5cGFzcyBtYXBwaW5nLiovXG4gICAgICByZXR1cm4gc2xvdFRvV3JhcHBlcihzbG90LCBpZmFjZSk7XG4gICAgfVxuICAgIGxldCB3cmFwcGVyID0gY3VycmVudFNsb3RUb1dyYXBwZXIuZ2V0KHNsb3QpO1xuICAgIGlmICghd3JhcHBlcikge1xuICAgICAgd3JhcHBlciA9IHNsb3RUb1dyYXBwZXIoc2xvdCwgaWZhY2UpO1xuICAgICAgY3VycmVudFNsb3RUb1dyYXBwZXIuc2V0KHNsb3QsIHdyYXBwZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7UGljazxNYXJzaGFsPFNsb3Q+LCAndG9DYXBEYXRhJyB8ICdmcm9tQ2FwRGF0YSc+fSAqL1xuICBjb25zdCBzbG90V3JhcHBlck1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChcbiAgICBjb252ZXJ0V3JhcHBlclRvU2xvdCxcbiAgICBjb252ZXJ0U2xvdFRvV3JhcHBlcixcbiAgICBtYXJzaGFsT3B0aW9ucyxcbiAgKTtcblxuICAvKipcbiAqIFJlc29sdmVzIGFuIGFycmF5IG9mIHdyYXBwZWQgbWFyc2hhbGxlcidzIHNsb3RzIHRvIGFuIGFycmF5IG9mXG4gKiBjYXBhYmlsaXRpZXMuXG4gKlxuICogVGhpcyBpcyB1c2VkIGJ5IGBmcm9tQ2FwRGF0YWAgdG8gbWFwIHNsb3RzIGJlZm9yZSB1c2luZyB0aGUgcGFzcy10aHJvdWdoXG4gKiBtYXJzaGFsbGVyIHRvIHJlY3JlYXRlIHRoZSBwYXNzYWJsZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7U2xvdFtdfSBzbG90c1xuICogQHBhcmFtIHsoaW5kZXg6IG51bWJlcikgPT4gUmVtb3RhYmxlU2xvdFdyYXBwZXI8Tm9uTnVsbGFibGU8U2xvdD4+fSBnZXRXcmFwcGVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwob2JqZWN0IHwgbnVsbClbXT59XG4gKi9cbiAgY29uc3QgbWFwU2xvdHNUb0NhcHMgPSBhc3luYyAoc2xvdHMsIGdldFdyYXBwZXIpID0+IHtcbiAgICBsZXQgaGFzUmVtb3RlQ2FwID0gZmFsc2U7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IHNsb3RzO1xuICAgIC8qKiBAdHlwZSB7KFJlbW90YWJsZVNsb3RXcmFwcGVyPE5vbk51bGxhYmxlPFNsb3Q+PiB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3Qgc2xvdFdyYXBwZXJNYXBwZWRTbG90cyA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG4gICAgLyoqIEB0eXBlIHsob2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICBjb25zdCBsb2NhbGx5UmVzb2x2ZWRDYXBTbG90cyA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc2xvdF0gb2Ygc2xvdHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoc2xvdCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBudWxsU2xvdCA9IC8qKiBAdHlwZSB7bnVsbH0gKi8gKHNsb3QpO1xuICAgICAgICBzbG90V3JhcHBlck1hcHBlZFNsb3RzW2luZGV4XSA9IG51bGxTbG90O1xuICAgICAgICBsb2NhbGx5UmVzb2x2ZWRDYXBTbG90c1tpbmRleF0gPSBudWxsU2xvdDtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlZENhcCA9IHNsb3RUb1ZhbD8uZ2V0KHNsb3QpO1xuICAgICAgICBpZiAoY2FjaGVkQ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWxUb1Nsb3Q/LnNldChjYWNoZWRDYXAsIHNsb3QpO1xuICAgICAgICAgIGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzW2luZGV4XSA9IGNhY2hlZENhcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNSZW1vdGVDYXAgPSB0cnVlO1xuICAgICAgICAgIHNsb3RXcmFwcGVyTWFwcGVkU2xvdHNbaW5kZXhdID0gZ2V0V3JhcHBlcihpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBudWxsO1xuICAgIGlmIChoYXNSZW1vdGVDYXApIHtcbiAgICAgIGhhcmRlbihzbG90V3JhcHBlck1hcHBlZFNsb3RzKTtcbiAgICAgIGNvbnN0IHNsb3RzT25seUNhcERhdGEgPSBzbG90V3JhcHBlck1hcnNoYWxsZXIudG9DYXBEYXRhKFxuICAgICAgICBzbG90V3JhcHBlck1hcHBlZFNsb3RzLFxuICAgICAgKTtcblxuICAgICAgLyoqIEB0eXBlIHsob2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICAgIGNvbnN0IHJlbW90ZWx5UmVzb2x2ZWRDYXBTbG90cyA9XG4gICAgICAgIGF3YWl0IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoc2xvdHNPbmx5Q2FwRGF0YSk7XG5cbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWxdIG9mIHJlbW90ZWx5UmVzb2x2ZWRDYXBTbG90cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW2luZGV4XTtcbiAgICAgICAgICBzbG90VG9WYWw/LnNldChzbG90LCB2YWwpO1xuICAgICAgICAgIHZhbFRvU2xvdD8uc2V0KHZhbCwgc2xvdCk7XG4gICAgICAgICAgbG9jYWxseVJlc29sdmVkQ2FwU2xvdHNbaW5kZXhdID0gdmFsO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW2luZGV4XTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBVbnJlc29sdmVkIGxvY2FsIHNsb3QgaW4gd3JhcHBlZCBtYXJzaGFsbGVyJywge1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBzbG90LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhcmRlbihsb2NhbGx5UmVzb2x2ZWRDYXBTbG90cyk7XG4gIH07XG5cbiAgLyoqXG4gKiBSZXNvbHZlcyBhbiBhcnJheSBvZiBjYXBhYmlsaXRpZXMgaW50byBhbiBhcnJheSBvZiBzbG90cyBvZiB0aGUgd3JhcHBlZFxuICogbWFyc2hhbGxlci5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgYnkgYHRvQ2FwRGF0YWAgdG8gbWFwIHNsb3RzIGFmdGVyIHRoZSBwYXNzLXRocm91Z2ggbWFyc2hhbGxlclxuICogaGFzIHNlcmlhbGl6ZWQgdGhlIHBhc3NhYmxlIGRhdGEuXG4gKlxuICogQHBhcmFtIHtvYmplY3RbXX0gY2Fwc1xuICogQHJldHVybnMge1Byb21pc2U8U2xvdFtdPn1cbiAqL1xuICBjb25zdCBtYXBDYXBzVG9TbG90cyA9IGFzeW5jIGNhcHMgPT4ge1xuICAgIGlmIChjYXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhcHM7XG4gICAgfVxuICAgIGxldCBoYXNSZW1vdGVDYXAgPSBmYWxzZTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gY2FwcztcbiAgICAvKiogQHR5cGUgeyhTbG90IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICBjb25zdCBsb2NhbGx5UmVzb2x2ZWRTbG90cyA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG4gICAgLyoqIEB0eXBlIHsob2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICBjb25zdCByZW1vdGVDYXBzVG9SZXNvbHZlID0gQXJyYXkuZnJvbSh7IGxlbmd0aCB9KTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjYXBdIG9mIGNhcHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY2FwID09PSBudWxsKSB7XG4gICAgICAgIC8qIFdlIHNob3VsZG4ndCBnZXQgbnVsbCBjYXBzIGhlcmUsIGJ1dCB3ZSBtaXJyb3IgaGFuZGxlIHRoZW0gYW55d2F5Ki9cbiAgICAgICAgY29uc3QgbnVsbENhcCA9IC8qKiBAdHlwZSB7bnVsbH0gKi8gKGNhcCk7XG4gICAgICAgIHJlbW90ZUNhcHNUb1Jlc29sdmVbaW5kZXhdID0gbnVsbENhcDtcbiAgICAgICAgbG9jYWxseVJlc29sdmVkU2xvdHNbaW5kZXhdID0gbnVsbENhcDtcbiAgICAgIH0gZWxzZSBpZiAoY2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkU2xvdCA9IHZhbFRvU2xvdD8uZ2V0KGNhcCk7XG4gICAgICAgIGlmIChjYWNoZWRTbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY2FjaGVkU2xvdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2xvdFRvVmFsPy5zZXQoY2FjaGVkU2xvdCwgY2FwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9jYWxseVJlc29sdmVkU2xvdHNbaW5kZXhdID0gY2FjaGVkU2xvdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNSZW1vdGVDYXAgPSB0cnVlO1xuICAgICAgICAgIHJlbW90ZUNhcHNUb1Jlc29sdmVbaW5kZXhdID0gY2FwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgbnVsbDtcbiAgICBpZiAoaGFzUmVtb3RlQ2FwKSB7XG4gICAgICBjb25zdCByZW1vdGVseVJlc29sdmVkU2xvdHNDYXBEYXRhID1cbiAgICAgICAgYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEocmVtb3RlQ2Fwc1RvUmVzb2x2ZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvKiogQHR5cGUgeyhSZW1vdGFibGVTbG90V3JhcHBlcjxTbG90PiB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgICAgIGNvbnN0IHNsb3RXcmFwcGVyTWFwcGVkU2xvdHMgPSBzbG90V3JhcHBlck1hcnNoYWxsZXIuZnJvbUNhcERhdGEoXG4gICAgICAgICAgcmVtb3RlbHlSZXNvbHZlZFNsb3RzQ2FwRGF0YSxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHNsb3RXcmFwcGVyXSBvZiBzbG90V3JhcHBlck1hcHBlZFNsb3RzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmIChzbG90V3JhcHBlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90ID0gY29udmVydFdyYXBwZXJUb1Nsb3Qoc2xvdFdyYXBwZXIpO1xuICAgICAgICAgICAgY29uc3QgdmFsID0gY2Fwc1tpbmRleF07XG4gICAgICAgICAgICBsb2NhbGx5UmVzb2x2ZWRTbG90c1tpbmRleF0gPSBzbG90O1xuICAgICAgICAgICAgaWYgKHNsb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBzbG90VG9WYWw/LnNldChzbG90LCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNsb3QgIT0gbnVsbCB8fCBjYWNoZVNldmVyZWRWYWwpIHtcbiAgICAgICAgICAgICAgdmFsVG9TbG90Py5zZXQodmFsLCBzbG90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsbHlSZXNvbHZlZFNsb3RzW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYXAgPSBjYXBzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIFVucmVzb2x2ZWQgbG9jYWwgc2xvdCBpbiB3cmFwcGVkIG1hcnNoYWxsZXInLCB7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBjYXAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgc2xvdFdyYXBwZXJNYXJzaGFsbGVyLCBjbGVhciBpdHMgc3RhdGUqL1xuICAgICAgICBjdXJyZW50U2xvdFRvV3JhcHBlci5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEFsbCBzbG90cyBzaG91bGQgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IG5vdyAob3Igd2FybmVkIGFib3V0KSovXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U2xvdFtdfSAqLyAoaGFyZGVuKGxvY2FsbHlSZXNvbHZlZFNsb3RzKSk7XG4gIH07XG5cbiAgLyoqXG4gKiBVbmZvcnR1bmF0ZWx5IENhcERhdGEgb25seSBjb250YWlucyBpZmFjZSBpbmZvcm1hdGlvbiBmb3Igc2xvdHRlZFxuICogY2FwYWJpbGl0aWVzIG5lc3RlZCBpbnNpZGUgdGhlIGJvZHksIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGVcbiAqIGJvZHkgdG8gZXh0cmFjdCBpdC4gTWF5YmUgaW4gdGhlIGZ1dHVyZSBDYXBEYXRhIGNvdWxkIGJlIGV4dGVuZGVkIHRvIGNhcnJ5XG4gKiB0aGlzIHNlcGFyYXRlbHkuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzI5OTFcbiAqXG4gKiBTaW5jZSB0aGlzIGhlbHBlciBpcyB1c2VkIGludGVybmFsbHkgdG8gdWx0aW1hdGVseSBwcm92aWRlIFNsb3RXcmFwcGVyXG4gKiBvYmplY3RzIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1hcnNoYWxsZXIsIGFuZCB0aGF0IHdlIHVzZSB0aGUgc2FtZVxuICogbWFyc2hhbGxlciB0byBleHRyYWN0IHRoZSBpZmFjZSBpbmZvcm1hdGlvbiwgZGlyZWN0bHkgcmV0dXJuIHRoZSBmdWxsXG4gKiBTbG90V3JhcHBlciBvYmplY3QgaW5zdGVhZCBvZiBqdXN0IHRoZSBpZmFjZS5cbiAqXG4gKiBAcGFyYW0ge0NhcERhdGE8U2xvdD59IGRhdGFcbiAqL1xuICBjb25zdCBtYWtlSWZhY2VFeHRyYWN0b3IgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHNsb3RzIH0gPSBkYXRhO1xuICAgIC8qKiBAcGFyYW0ge251bWJlcn0gaW5kZXggKi9cbiAgICBjb25zdCBnZXRXcmFwcGVyID0gaW5kZXggPT4ge1xuICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW2luZGV4XTtcbiAgICAgIGxldCB3cmFwcGVyID0gY3VycmVudFNsb3RUb1dyYXBwZXIuZ2V0KHNsb3QpO1xuICAgICAgaWYgKCF3cmFwcGVyKSB7XG4gICAgICAgIHZvaWQgc2xvdFdyYXBwZXJNYXJzaGFsbGVyLmZyb21DYXBEYXRhKGRhdGEpO1xuICAgICAgfVxuICAgICAgd3JhcHBlciA9IGN1cnJlbnRTbG90VG9XcmFwcGVyLmdldChzbG90KTtcbiAgICAgIGlmICghd3JhcHBlcikge1xuICAgICAgICB0aHJvdyBGYWlsYE1hcnNoYWxsZXIgZGlkbid0IGNyZWF0ZSB3cmFwcGVyIGZvciBzbG90ICR7cShzbG90KX0gKGluZGV4PSR7cShpbmRleCl9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGdldFdyYXBwZXI7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPENhcERhdGE8U2xvdD4+fVxuICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IGFzeW5jIHZhbCA9PiB7XG4gICAgY29uc3QgY2FwRGF0YSA9IHBhc3NUaHJvdWdoTWFyc2hhbGxlci50b0NhcERhdGEodmFsKTtcbiAgICBjb25zdCBtYXBwZWRTbG90cyA9IGF3YWl0IG1hcENhcHNUb1Nsb3RzKGNhcERhdGEuc2xvdHMpO1xuICAgIHJldHVybiBoYXJkZW4oeyAuLi5jYXBEYXRhLCBzbG90czogbWFwcGVkU2xvdHMgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NhcERhdGE8U2xvdD59IGRhdGFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9IGFzeW5jIGRhdGEgPT4ge1xuICAgIGNvbnN0IGdldFdyYXBwZXIgPSBtYWtlSWZhY2VFeHRyYWN0b3IoZGF0YSk7XG4gICAgYXdhaXQgbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFwcGVkU2xvdHMgPSBhd2FpdCBtYXBTbG90c1RvQ2FwcyhkYXRhLnNsb3RzLCBnZXRXcmFwcGVyKTtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcnNoYWxsZXIuZnJvbUNhcERhdGEoeyAuLi5kYXRhLCBzbG90czogbWFwcGVkU2xvdHMgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRTbG90VG9XcmFwcGVyLmNsZWFyKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoJ3dyYXBwZWQgcmVtb3RlIG1hcnNoYWxsZXInLCB7XG4gICAgdG9DYXBEYXRhLFxuICAgIGZyb21DYXBEYXRhLFxuXG4gICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuICAgIHNlcmlhbGl6ZTogdG9DYXBEYXRhLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbiAgICB1bnNlcmlhbGl6ZTogZnJvbUNhcERhdGEsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxQaWNrPEVNYXJzaGFsbGVyPFNsb3Q+LCAnZnJvbUNhcERhdGEnIHwgJ3RvQ2FwRGF0YSc+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEZhcjxFTWFyc2hhbGxlcjxTbG90Pj4+fVxuICovJGjNj19vbmNlLndyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSh3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkpO1xuICAgICAgIGNvbnN0IHdyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCA9IG1hcnNoYWxsZXIgPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8Q2FwRGF0YTxTbG90Pj59XG4gKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gdmFsID0+IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NhcERhdGE8U2xvdD59IGRhdGFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKTtcblxuICByZXR1cm4gRmFyKCd3cmFwcGVkIHJlbW90ZSBtYXJzaGFsbGVyJywge1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLndyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCh3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQpO1xuXG4gICAgICAgY29uc3Qgd3JhcFJlbW90ZU1hcnNoYWxsZXIgPSB3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHk7JGjNj19vbmNlLndyYXBSZW1vdGVNYXJzaGFsbGVyKHdyYXBSZW1vdGVNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSI6WyJ3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkiXSwid3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kIjpbIndyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCJdLCJ3cmFwUmVtb3RlTWFyc2hhbGxlciI6WyJ3cmFwUmVtb3RlTWFyc2hhbGxlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAr7RBF8Q0AAPENAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIl0sImV4cG9ydHMiOlsiYmluZEFsbE1ldGhvZHMiLCJnZXRNZXRob2ROYW1lcyIsImdldFN0cmluZ01ldGhvZE5hbWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcmVhbEdldE1ldGhvZE5hbWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChyZWFsR2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGZpbGUgbWV0aG9kLXRvb2xzIHVzZSBkeW5hbWljIHByb3BlcnR5IGxvb2t1cCwgd2hpY2ggaXMgbm90XG4gKiAgIEplc3NpZS1jb21wYXRpYmxlXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGdldE1ldGhvZE5hbWVzYCBmcm9tIGBAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzYCBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT5cbiAgLyoqIEB0eXBlIHtLW119ICovIChyZWFsR2V0TWV0aG9kTmFtZXModmFsKSk7JGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgZ2V0TWV0aG9kTmFtZXNgIGNvbnRhaW5pbmcgb25seSBzdHJpbmcgbmFtZXMsIHdpdGhvdXQgc3ltYm9sc1xuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0U3RyaW5nTWV0aG9kTmFtZXMgPSB2YWwgPT5cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKFxuICAgIHJlYWxHZXRNZXRob2ROYW1lcyh2YWwpLmZpbHRlcihuYW1lID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJylcbiAgKTtcblxuLyoqXG4gKiBUT0RPIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG9ubHkgdG8gZWFzZSB0aGVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU5NzAgdHJhbnNpdGlvbiwgZnJvbSBhbGwgbWV0aG9kc1xuICogYmVpbmcgb3duIHByb3BlcnRpZXMgdG8gbWV0aG9kcyBiZWluZyBpbmhlcml0ZWQgZnJvbSBhIGNvbW1vbiBwcm90b3R5cGUuIFRoaXNcbiAqIHRyYW5zaXRpb24gYnJlYWtzIHR3byBwYXR0ZXJucyB1c2VkIGluIHByaW9yIGNvZGU6IGF1dG9iaW5kaW5nLCBhbmRcbiAqIGVudW1lcmF0aW5nIG1ldGhvZHMgYnkgZW51bWVyYXRpbmcgb3duIHByb3BlcnRpZXMuIEZvciBib3RoLCB0aGUgcHJlZmVycmVkXG4gKiByZXBhaXJzIGFyZVxuICpcbiAqIC0gYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLCBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+XG4gKiAgIGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmcgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGB0b1xuICogICBleHRyYWN0IGEgbWV0aG9kIHN0aWxsIGJvdW5kIHRvIHRoZSBzdGF0ZSBvZmBvYmpgIGJlY2F1c2UsIGZvciB2aXJ0dWFsIGFuZFxuICogICBkdXJhYmxlIG9iamVjdHMsIHRoZXkgbm8gbG9uZ2VyIHdpbGwgYWZ0ZXIgIzU5NzAuXG4gKiAtIG1ldGhvZCBlbnVtZXJhdGlvbjogUmVwbGFjZSwgZm9yIGV4YW1wbGUgYFJlZmxlY3Qub3duS2V5cyhvYmopYCB3aXRoXG4gKiAgIGBnZXRNZXRob2ROYW1lcyhvYmopYC5cbiAqXG4gKiBPbmNlIGFsbCBwcm9ibGVtYXRpYyBjYXNlcyBoYXZlIGJlZW4gY29udmVydGVkIGluIHRoaXMgbWFubmVyLCB0aGlzXG4gKiBgYmluZEFsbE1ldGhvZHNgIGhhY2sgY2FuIGFuZCBUT0RPIHNob3VsZCBiZSBkZWxldGVkLiBIb3dldmVyLCB3ZSBjdXJyZW50bHlcbiAqIGhhdmUgbm8gcmVsaWFibGUgc3RhdGljIHdheSB0byB0cmFjayBkb3duIGFuZCBmaXggYWxsIGF1dG9iaW5kaW5nIHNpdGVzLiBGb3JcbiAqIHRob3NlIG9iamVjdHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBmdWxseSByZXBhaXJlZCBieSB0aGUgYWJvdmUgdHdvXG4gKiB0ZWNobmlxdWVzLCBgYmluZEFsbE1ldGhvZHNgIGNyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBtdWNoIGxpa2UgdGhlXG4gKiBwcmUtIzU5NzAgb2JqZWN0cywgd2l0aCBhbGwgdGhlaXIgbWV0aG9kcyBhcyBpbnN0YW5jZS1ib3VuZCBvd24gcHJvcGVydGllcy5cbiAqIEl0IGRvZXMgdGhpcyBieSBtYWtpbmcgYSBuZXcgb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgb2JqYCB3aGVyZSB0aGUgbmV3XG4gKiBvYmplY3QgaGFzIGJvdW5kIG93biBtZXRob2RzIG92ZXJyaWRkaW5nIGFsbCB0aGUgbWV0aG9kcyBpdCB3b3VsZCBoYXZlXG4gKiBpbmhlcml0ZWQgZnJvbSBgb2JqYC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgYW55Pn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEByZXR1cm5zIHtUfVxuICovJGjNj19vbmNlLmdldFN0cmluZ01ldGhvZE5hbWVzKGdldFN0cmluZ01ldGhvZE5hbWVzKTtcbiAgICAgICBjb25zdCBiaW5kQWxsTWV0aG9kcyA9IG9iaiA9PlxuICBoYXJkZW4oXG4gICAgY3JlYXRlKFxuICAgICAgb2JqLFxuICAgICAgZnJvbUVudHJpZXMoXG4gICAgICAgIHJlYWxHZXRNZXRob2ROYW1lcyhvYmopLm1hcChuYW1lID0+IFtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAoLyoqIEB0eXBlIHt1bmtub3duW119ICovIC4uLmFyZ3MpID0+XG4gICAgICAgICAgICAgIGFwcGx5KG9ialtuYW1lXSwgb2JqLCBhcmdzKSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICk7JGjNj19vbmNlLmJpbmRBbGxNZXRob2RzKGJpbmRBbGxNZXRob2RzKTtcbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJnZXRTdHJpbmdNZXRob2ROYW1lcyI6WyJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJiaW5kQWxsTWV0aG9kcyI6WyJiaW5kQWxsTWV0aG9kcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQ/SB4oEIAAKBCAAAmAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldHJpY3MuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiLCJISVNUT0dSQU1fTUVUUklDUyIsIktFUk5FTF9TVEFUU19NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIiwiUXVldWVNZXRyaWNBc3BlY3QiLCJtYWtlUXVldWVNZXRyaWNzIiwibWFrZVF1ZXVlTWV0cmljc01ldGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNZXRlciBhcyBPVGVsTWV0ZXIsIE1ldHJpY0F0dHJpYnV0ZXN9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG4gKiBAaW1wb3J0IHtUb3RhbE1hcH0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKi9cblxuY29uc3QgSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyA9IFtcbiAgNSxcbiAgMTAsXG4gIDI1LFxuICA1MCxcbiAgMTAwLFxuICAyNTAsXG4gIDUwMCxcbiAgMTAwMCxcbiAgMjUwMCxcbiAgNTAwMCxcbiAgMTAwMDAsXG4gIEluZmluaXR5LFxuXTtcbmNvbnN0IEhJU1RPR1JBTV9TRUNPTkRTX0xBVEVOQ1lfQk9VTkRBUklFUyA9XG4gIEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMubWFwKG1zID0+IG1zIC8gMTAwMCk7XG5cbi8qIFRPRE86IFZhbGlkYXRlIHRoZXNlIGJvdW5kYXJpZXMuIFdlJ3JlIG5vdCBnb2luZyB0byBoYXZlIDVtcyBibG9ja3MsIGJ1dCovXG4vKiB3ZSBwcm9iYWJseSBjYXJlIGFib3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMTAgdnMuIDMwIHNlY29uZHMuKi9cbiAgICAgICBjb25zdCBISVNUT0dSQU1fTUVUUklDUyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIHN3aW5nc2V0X2NyYW5rX3Byb2Nlc3NpbmdfdGltZToge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJvY2Vzc2luZyB0aW1lIHBlciBjcmFuayAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEFycmF5Lm9mKDEsIDExLCAyMSwgMzEsIDQxLCA1MSwgNjEsIDcxLCA4MSwgOTEsIEluZmluaXR5KSxcbiAgfSxcbiAgc3dpbmdzZXRfYmxvY2tfcHJvY2Vzc2luZ19zZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9jZXNzaW5nIHRpbWUgcGVyIGJsb2NrJyxcbiAgICB1bml0OiAncycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX1NFQ09ORFNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF92YXRfc3RhcnR1cDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IHN0YXJ0dXAgdGltZSAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X3ZhdF9kZWxpdmVyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IGRlbGl2ZXJ5IHRpbWUgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF9tZXRlcl91c2FnZToge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IG1ldGVyIHVzYWdlJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG59KTskaM2PX29uY2UuSElTVE9HUkFNX01FVFJJQ1MoSElTVE9HUkFNX01FVFJJQ1MpO1xuXG5jb25zdCBibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MgPSB7XG4gIC8qIERpc2FibGVkIGJlY2F1c2UgaW1wb3J0aW5nIGZyb20gQG9wZW50ZWxlbWV0cnkvYXBpIGJyZWFrcyBrZXJuZWwgYnVuZGxpbmcuKi9cbiAgLyogVGhhbmtmdWxseSwgaXQncyB0aGUgZGVmYXVsdCBhbnl3YXk6Ki9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktanMvYmxvYi9mNGRkMmExMDYyZjk4MGNkMzQ0Y2ZiMTcyYTUxNWQwMDExNWRmNTcwL2FwaS9zcmMvbWV0cmljcy9NZXRyaWMudHMjTDUzLUw1NyovXG4gIC8qIHZhbHVlVHlwZTogVmFsdWVUeXBlLkRPVUJMRSwqL1xuICB1bml0OiAncycsXG4gIGFkdmljZToge1xuICAgIGV4cGxpY2l0QnVja2V0Qm91bmRhcmllczogW1xuICAgICAgMC4xLCAwLjIsIDAuMywgMC40LCAwLjUsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDEwLCAxNSwgMzAsXG4gICAgXSxcbiAgfSxcbn07XG4gICAgICAgY29uc3QgQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBzd2luZ3NldFJ1blNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IGV4ZWN1dGluZyBTd2luZ1NldCcsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBzd2luZ3NldENoYWluU2F2ZVNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IHByb3BhZ2F0aW5nIFN3aW5nU2V0IHN0YXRlIGludG8gY29zbW9zJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIHN3aW5nc2V0Q29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgU3dpbmdTZXQgc3RhdGUgdG8gaG9zdCBzdG9yYWdlJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGNvc21vc0NvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgY29zbW9zIHN0YXRlJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGZ1bGxDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBzdGF0ZSwgaW5jbHVzaXZlIG9mIENPTU1JVF9CTE9DSyBwcm9jZXNzaW5nIHBsdXMgdGltZSBzcGVudCBbb3V0c2lkZSBvZiBjb3NtaWMtc3dpbmdzZXRdIGJlZm9yZSBhbmQgYWZ0ZXIgaXQnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgaW50ZXJCbG9ja1NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWUgc3BlbnQgaWRsZSBiZXR3ZWVuIGJsb2NrcycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBhZnRlckNvbW1pdEhhbmdvdmVyU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IHdhaXRpbmcgZm9yIHByZXZpb3VzLWJsb2NrIGFmdGVyQ29tbWl0IHdvcmsnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgYmxvY2tMYWdTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGVsYXkgb2YgZWFjaCBibG9jayBmcm9tIGl0cyBleHBlY3RlZCBiZWdpbiB0aW1lJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gICAgLyogQWRkIGJ1Y2tldHMgZm9yIGV4Y2Vzc2l2ZWx5IGxvbmcgZGVsYXlzLiovXG4gICAgYWR2aWNlOiB7XG4gICAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MuYWR2aWNlLFxuICAgICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiAvKiogQHR5cGUge251bWJlcltdfSAqLyAoW1xuICAgICAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MuYWR2aWNlLmV4cGxpY2l0QnVja2V0Qm91bmRhcmllcyxcbiAgICAgICAgLi4uWzYwLCAxMjAsIDE4MCwgMjQwLCAzMDAsIDYwMCwgMzYwMF0sXG4gICAgICBdKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbi8qKiBAZW51bSB7KHR5cGVvZiBRdWV1ZU1ldHJpY0FzcGVjdClba2V5b2YgdHlwZW9mIFF1ZXVlTWV0cmljQXNwZWN0XX0gKi8kaM2PX29uY2UuQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MoQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MpO1xuICAgICAgIGNvbnN0IFF1ZXVlTWV0cmljQXNwZWN0ID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgTGVuZ3RoOiAnbGVuZ3RoJyxcbiAgSW5jcmVtZW50Q291bnQ6ICdpbmNyZW1lbnRzJyxcbiAgRGVjcmVtZW50Q291bnQ6ICdkZWNyZW1lbnRzJyxcbn0pO1xuXG4vKipcbiAqIFF1ZXVlIG1ldHJpY3MgY29tZSBpbiB7bGVuZ3RoLGFkZCxyZW1vdmV9IHRyaXBsZXMgc2hhcmluZyBhIGNvbW1vbiBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVQcmVmaXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjUHJlZml4XG4gKiBAcmV0dXJucyB7UmVjb3JkPFxuICogICBRdWV1ZU1ldHJpY0FzcGVjdCxcbiAqICAgeyBuYW1lOiBzdHJpbmc7IG9wdGlvbnM6IE1ldHJpY0F0dHJpYnV0ZXMgfVxuICogPn1cbiAqLyRozY9fb25jZS5RdWV1ZU1ldHJpY0FzcGVjdChRdWV1ZU1ldHJpY0FzcGVjdCk7XG4gICAgICAgY29uc3QgbWFrZVF1ZXVlTWV0cmljc01ldGEgPSAobmFtZVByZWZpeCwgZGVzY1ByZWZpeCkgPT4ge1xuICAvKiogQHR5cGUge1tRdWV1ZU1ldHJpY0FzcGVjdCwgc3RyaW5nLCBzdHJpbmddW119ICovXG4gIGNvbnN0IG1ldHJpY3NNZXRhID0gW1xuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5MZW5ndGgsICdsZW5ndGgnLCAnbGVuZ3RoJ10sXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkluY3JlbWVudENvdW50LCAnYWRkJywgJ2luY3JlbWVudHMnXSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuRGVjcmVtZW50Q291bnQsICdyZW1vdmUnLCAnZGVjcmVtZW50cyddLFxuICBdO1xuICBjb25zdCBlbnRyaWVzID0gbWV0cmljc01ldGEubWFwKChbYXNwZWN0LCBuYW1lU3VmZml4LCBkZXNjU3VmZml4XSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBgJHtuYW1lUHJlZml4fV8ke25hbWVTdWZmaXh9YDtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGAke2Rlc2NQcmVmaXh9ICR7ZGVzY1N1ZmZpeH1gO1xuICAgIC8qIEZ1dHVyZSBPcGVuVGVsZW1ldHJ5IFNES3Mgc2hvdWxkIGFsc28gc3VwcG9ydCBjcmVhdGluZyBJbnN0cnVtZW50cyB3aXRoKi9cbiAgICAvKiBhdHRyaWJ1dGUga2V5cyAoc3VjaCBhcyB0aGUgXCJxdWV1ZVwiIGF0dHJpYnV0ZSBmb3IqL1xuICAgIC8qIFwiY29zbWljX3N3aW5nc2V0X2luYm91bmRfcXVldWVfe2xlbmd0aCxhZGQscmVtb3ZlfVwiIG1lYXN1cmVtZW50cyk6Ki9cbiAgICAvKiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9vdGVsL21ldHJpY3MvYXBpLyNpbnN0cnVtZW50LWFkdmlzb3J5LXBhcmFtZXRlci1hdHRyaWJ1dGVzKi9cbiAgICAvKiBBdCB0aGF0IHRpbWUsIGEgbmV3IGZpZWxkIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyByZWNvcmQuKi9cbiAgICByZXR1cm4gW2FzcGVjdCwgeyBuYW1lLCBvcHRpb25zOiB7IGRlc2NyaXB0aW9uIH0gfV07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUXVldWVOYW1lXG4gKiBAdHlwZWRlZiBRdWV1ZU1ldHJpY3NcbiAqIEBwcm9wZXJ0eSB7KGxlbmd0aHM6IFJlY29yZDxRdWV1ZU5hbWUsIG51bWJlcj4pID0+IHZvaWR9IGluaXRMZW5ndGhzIG11c3QgYmVcbiAqICAgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KGxlbmd0aHM6IFJlY29yZDxRdWV1ZU5hbWUsIG51bWJlcj4pID0+IHZvaWR9IHVwZGF0ZUxlbmd0aHNcbiAqIEBwcm9wZXJ0eSB7KHF1ZXVlOiBRdWV1ZU5hbWUsIGRlbHRhPzogbnVtYmVyKSA9PiB2b2lkfSBpbmNMZW5ndGggZm9yIGFcbiAqICAgbm9uLW5lZ2F0aXZlIGRlbHRhXG4gKiBAcHJvcGVydHkgeyhxdWV1ZTogUXVldWVOYW1lLCBkZWx0YT86IG51bWJlcikgPT4gdm9pZH0gZGVjTGVuZ3RoIGZvciBhXG4gKiAgIG5vbi1uZWdhdGl2ZSBkZWx0YVxuICovXG5cbi8qKlxuICogQ3JlYXRlIHtsZW5ndGgsYWRkLHJlbW92ZX0gSW5zdHJ1bWVudHMgZm9yIGEgcXVldWUgYW5kIHJldHVybiBmdW5jdGlvbnMgZm9yXG4gKiBjb25zaXN0ZW50bHkgaW5pdGlhbGl6aW5nIGFuZCB1cGRhdGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBRdWV1ZU5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAqIEBwYXJhbSB7T1RlbE1ldGVyfSBjb25maWcub3RlbE1ldGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLm5hbWVQcmVmaXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWcuZGVzY1ByZWZpeFxuICogQHBhcmFtIHtQaWNrPENvbnNvbGUsICd3YXJuJz59IFtjb25maWcuY29uc29sZV1cbiAqIEByZXR1cm5zIHtRdWV1ZU1ldHJpY3M8UXVldWVOYW1lPn1cbiAqLyRozY9fb25jZS5tYWtlUXVldWVNZXRyaWNzTWV0YShtYWtlUXVldWVNZXRyaWNzTWV0YSk7XG4gICAgICAgY29uc3QgbWFrZVF1ZXVlTWV0cmljcyA9ICh7XG4gIG90ZWxNZXRlcixcbiAgbmFtZVByZWZpeCxcbiAgZGVzY1ByZWZpeCxcbiAgY29uc29sZSxcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5MZW5ndGhdOiBsZW5ndGhNZXRhLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5JbmNyZW1lbnRDb3VudF06IHVwTWV0YSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuRGVjcmVtZW50Q291bnRdOiBkb3duTWV0YSxcbiAgfSA9IG1ha2VRdWV1ZU1ldHJpY3NNZXRhKG5hbWVQcmVmaXgsIGRlc2NQcmVmaXgpO1xuICAvKiBUT0RPOiBXaGVuIGl0J3MgZGVlbWVkIHNhZmUgdG8gY2hhbmdlIHJlcG9ydGVkIG1ldHJpY3MsIG1ha2UgdXBDb3VudGVyIGFuZCovXG4gIC8qIGRvd25Db3VudGVyIHN5bmNocm9ub3VzIChhbmQgZHJvcCBgaW5jcmVtZW50c2AgYW5kIGBkZWNyZW1lbnRzYCBtYXBzKS4qL1xuICAvKiBXZSBjYW4ndCBkbyBzbyB1bnRpbCB0aGVuIGJlY2F1c2UgaXQgd2lsbCBhZGQgYSBcIl90b3RhbFwiIHN1ZmZpeCB0byB0aGUqL1xuICAvKiBQcm9tZXRoZXVzIGV4cG9ydCBtZXRyaWMgbmFtZSwgZGl2ZXJnaW5nIGZyb20gYG1ha2VJbmJvdW5kUXVldWVNZXRyaWNzYCBpbiovXG4gIC8qIHBhY2thZ2VzL2Nvc21pYy1zd2luZ3NldC9zcmMva2VybmVsLXN0YXRzLmpzLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvbWFpbi9kb2MvdXBncmFkZS10by0yLngubWQjLW90aGVyLWNoYW5nZXMqL1xuICBjb25zdCBsZW5ndGhDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZVVwRG93bkNvdW50ZXIoXG4gICAgbGVuZ3RoTWV0YS5uYW1lLFxuICAgIGxlbmd0aE1ldGEub3B0aW9ucyxcbiAgKTtcbiAgLyogY29uc3QgdXBDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZUNvdW50ZXIodXBNZXRhLm5hbWUsIHVwTWV0YS5vcHRpb25zKTsqL1xuICAvKiBjb25zdCBkb3duQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVDb3VudGVyKGRvd25NZXRhLm5hbWUsIGRvd25NZXRhLm9wdGlvbnMpOyovXG4gIGNvbnN0IHVwQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcihcbiAgICB1cE1ldGEubmFtZSxcbiAgICB1cE1ldGEub3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZG93bkNvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZUNvdW50ZXIoXG4gICAgZG93bk1ldGEubmFtZSxcbiAgICBkb3duTWV0YS5vcHRpb25zLFxuICApO1xuICBjb25zdCBpbmNyZW1lbnRzID0gLyoqIEB0eXBlIHtUb3RhbE1hcDxzdHJpbmcsIG51bWJlcj59ICovIChuZXcgTWFwKCkpO1xuICBjb25zdCBkZWNyZW1lbnRzID0gLyoqIEB0eXBlIHtUb3RhbE1hcDxzdHJpbmcsIG51bWJlcj59ICovIChuZXcgTWFwKCkpO1xuICB1cENvdW50ZXIuYWRkQ2FsbGJhY2sob2JzZXJ2ZXIgPT4ge1xuICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgdmFsdWVdIG9mIGluY3JlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHZhbHVlLCB7IHF1ZXVlOiBxdWV1ZU5hbWUgfSk7XG4gICAgfVxuICB9KTtcbiAgZG93bkNvdW50ZXIuYWRkQ2FsbGJhY2sob2JzZXJ2ZXIgPT4ge1xuICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgdmFsdWVdIG9mIGRlY3JlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHZhbHVlLCB7IHF1ZXVlOiBxdWV1ZU5hbWUgfSk7XG4gICAgfVxuICB9KTtcblxuICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgY29uc3QgbGVuZ3RocyA9IC8qKiBAdHlwZSB7VG90YWxNYXA8c3RyaW5nLCBudW1iZXI+fSAqLyAobmV3IE1hcCgpKTtcbiAgY29uc3QgbnVkZ2UgPSAocXVldWVOYW1lLCBkZWx0YSwgaW5pdCA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKCFsZW5ndGhzLmhhcyhxdWV1ZU5hbWUpKSB7XG4gICAgICBpZiAoIWluaXQpIGNvbnNvbGU/Lndhcm4oJ1Vua25vd24gcXVldWUnLCBxdWV1ZU5hbWUpO1xuICAgICAgbGVuZ3Rocy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICAgIGluY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgICBkZWNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgIH1cbiAgICBjb25zdCBvbGRMZW5ndGggPSBsZW5ndGhzLmdldChxdWV1ZU5hbWUpO1xuICAgIGxlbmd0aHMuc2V0KHF1ZXVlTmFtZSwgb2xkTGVuZ3RoICsgZGVsdGEpO1xuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB7IHF1ZXVlOiBxdWV1ZU5hbWUgfTtcbiAgICBsZW5ndGhDb3VudGVyLmFkZChkZWx0YSwgZGltZW5zaW9ucyk7XG4gICAgaWYgKGluaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGRlbHRhID4gMCkge1xuICAgICAgLyogVE9ETyBwZXIgYWJvdmU6IHVwQ291bnRlci5hZGQoZGVsdGEsIGRpbWVuc2lvbnMpOyovXG4gICAgICBpbmNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIChpbmNyZW1lbnRzLmdldChxdWV1ZU5hbWUpIHx8IDApICsgZGVsdGEpO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICAvKiBUT0RPIHBlciBhYm92ZTogZG93bkNvdW50ZXIuYWRkKC1kZWx0YSwgZGltZW5zaW9ucyk7Ki9cbiAgICAgIGRlY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgKGRlY3JlbWVudHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkgLSBkZWx0YSk7XG4gICAgfVxuICAgIHJlYWR5ID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBpbml0TGVuZ3RoczogaW5pdGlhbExlbmd0aHMgPT4ge1xuICAgICAgIXJlYWR5IHx8XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgcmVwZWF0IHF1ZXVlIGxlbmd0aCBpbml0aWFsaXphdGlvbiBmcm9tICR7cShsZW5ndGhzKX0gdG8gJHtxKGluaXRpYWxMZW5ndGhzKX1gXG4gICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIG5ld0xlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMoaW5pdGlhbExlbmd0aHMpKSB7XG4gICAgICAgIGlmICghaXNOYXQobmV3TGVuZ3RoKSkge1xuICAgICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgbGVuZ3RoIGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgbmV3TGVuZ3RoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBudWRnZShxdWV1ZU5hbWUsIG5ld0xlbmd0aCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVMZW5ndGhzOiBuZXdMZW5ndGhzID0+IHtcbiAgICAgIHJlYWR5IHx8IGNvbnNvbGU/Lndhcm4oJ01pc3NpbmcgaW5pdGlhbCBxdWV1ZSBsZW5ndGhzJyk7XG4gICAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIG5ld0xlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMobmV3TGVuZ3RocykpIHtcbiAgICAgICAgaWYgKCFpc05hdChuZXdMZW5ndGgpKSB7XG4gICAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBsZW5ndGggZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBuZXdMZW5ndGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgbmV3TGVuZ3RoIC0gKGxlbmd0aHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaW5jTGVuZ3RoOiAocXVldWVOYW1lLCBkZWx0YSA9IDEpID0+IHtcbiAgICAgIGlmICghaXNOYXQoZGVsdGEpKSB7XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgaW5jcmVtZW50IGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgZGVsdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWRnZShxdWV1ZU5hbWUsIGRlbHRhKTtcbiAgICB9LFxuICAgIGRlY0xlbmd0aDogKHF1ZXVlTmFtZSwgZGVsdGEgPSAxKSA9PiB7XG4gICAgICBpZiAoIWlzTmF0KGRlbHRhKSkge1xuICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGRlY3JlbWVudCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbnVkZ2UocXVldWVOYW1lLCAtZGVsdGEpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLyogQWxsIHRoZSBrZXJuZWwgbWV0cmljcyB3ZSBhcmUgcHJlcGFyZWQgZm9yLiovXG4vKiogQGVudW0geyh0eXBlb2YgTWV0cmljVHlwZSlba2V5b2YgdHlwZW9mIE1ldHJpY1R5cGVdfSBNZXRyaWNUeXBlICovJGjNj19vbmNlLm1ha2VRdWV1ZU1ldHJpY3MobWFrZVF1ZXVlTWV0cmljcyk7XG5jb25zdCBNZXRyaWNUeXBlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgQ291bnRlcjogJ2NvdW50ZXInLFxuICBHYXVnZTogJ2dhdWdlJyxcbn0pO1xuLyoqXG4gKiBAdHlwZWRlZiBLZXJuZWxNZXRyaWNNZXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHt7IGRpbWVuc2lvbjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH19IFtzdWJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnNlbnN1c11cbiAqIEBwcm9wZXJ0eSB7TWV0cmljVHlwZX0gbWV0cmljVHlwZVxuICovXG4vKiogQHR5cGUge09taXQ8S2VybmVsTWV0cmljTWV0YSwgJ21ldHJpY1R5cGUnPltdfSAqL1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19TVU1fTUVUUklDUyA9IFtcbiAge1xuICAgIGtleTogJ3N5c2NhbGxzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfYWxsX3N5c2NhbGxfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsU2VuZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdzZW5kJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IG1lc3NhZ2Ugc2VuZCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbENhbGxOb3cnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnY2FsbE5vdycgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBzeW5jaHJvbm91cyBkZXZpY2Uga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxTdWJzY3JpYmUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnc3Vic2NyaWJlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHByb21pc2Ugc3Vic2NyaXB0aW9uIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsUmVzb2x2ZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdyZXNvbHZlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHByb21pc2UgcmVzb2x1dGlvbiBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbEV4aXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnZXhpdCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgZXhpdCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlR2V0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlR2V0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGdldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlU2V0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlU2V0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIHNldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlR2V0TmV4dEtleScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZUdldE5leHQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZ2V0TmV4dEtleSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlRGVsZXRlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlRGVsZXRlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGRlbGV0ZSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbERyb3BJbXBvcnRzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2Ryb3BJbXBvcnRzJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IGRyb3AgaW1wb3J0cyBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hEZWxpdmVyJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfZGVsaXZlcl90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IG1lc3NhZ2UgZGVsaXZlcmllcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaE5vdGlmeScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX25vdGlmeV90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IHByb21pc2Ugbm90aWZpY2F0aW9ucycsXG4gIH0sXG5dO1xuXG4vKiogQHR5cGUge09taXQ8S2VybmVsTWV0cmljTWV0YSwgJ21ldHJpY1R5cGUnPltdfSAqLyRozY9fb25jZS5LRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MoS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTKTtcbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MgPSBbXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxPYmplY3RzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX29iamVjdHMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBvYmplY3RzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlcm5lbERldmljZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfZGV2aWNlcycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIGRldmljZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna2VybmVsUHJvbWlzZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcFVucmVzb2x2ZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF91bnJlc29sdmVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdVbnJlc29sdmVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcEZ1bGZpbGxlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Z1bGZpbGxlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRnVsZmlsbGVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcFJlamVjdGVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcmVqZWN0ZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1JlamVjdGVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdydW5RdWV1ZUxlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3J1bl9xdWV1ZV9sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0xlbmd0aCBvZiB0aGUga2VybmVsIHJ1biBxdWV1ZScsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdhY2NlcHRhbmNlUXVldWVMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9hY2NlcHRhbmNlX3F1ZXVlX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnTGVuZ3RoIG9mIHRoZSBrZXJuZWwgYWNjZXB0YW5jZSBxdWV1ZScsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwcm9taXNlUXVldWVzTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcHJvbWlzZV9xdWV1ZXNfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdDb21iaW5lZCBsZW5ndGggb2YgYWxsIGtlcm5lbCBwcm9taXNlIHF1ZXVlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjbGlzdEVudHJpZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9jbGlzdF9lbnRyaWVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBlbnRyaWVzIGluIHRoZSBrZXJuZWwgYy1saXN0JyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3ZhdHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF92YXRzJyxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBhY3RpdmUgdmF0cycsXG4gIH0sXG5dOyRozY9fb25jZS5LRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MoS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTKTtcblxuY29uc3QgeyBDb3VudGVyLCBHYXVnZSB9ID0gTWV0cmljVHlwZTtcbi8qKiBAdHlwZSB7S2VybmVsTWV0cmljTWV0YVtdfSAqL1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19NRVRSSUNTID0gaGFyZGVuKFtcbiAgLi4uS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTLm1hcChtID0+ICh7IC4uLm0sIG1ldHJpY1R5cGU6IENvdW50ZXIgfSkpLFxuICAuLi5LRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MubWFwKG0gPT4gKHsgLi4ubSwgbWV0cmljVHlwZTogR2F1Z2UgfSkpLFxuXSk7XG5cbi8qIEVuc3VyZSBrZXJuZWwgc3RhdHMga2V5IHVuaXF1ZW5lc3MuKi8kaM2PX29uY2UuS0VSTkVMX1NUQVRTX01FVFJJQ1MoS0VSTkVMX1NUQVRTX01FVFJJQ1MpO1xuY29uc3Qga2VybmVsU3RhdHNLZXlzID0gbmV3IE1hcCgpO1xuZm9yIChjb25zdCB7IGtleSB9IG9mIEtFUk5FTF9TVEFUU19NRVRSSUNTKSB7XG4gIGtlcm5lbFN0YXRzS2V5cy5zZXQoa2V5LCAoa2VybmVsU3RhdHNLZXlzLmdldChrZXkpIHx8IDApICsgMSk7XG59XG5jb25zdCBkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMgPSBbLi4ua2VybmVsU3RhdHNLZXlzLmVudHJpZXMoKV0uZmxhdE1hcChcbiAgKFtrZXksIHZhbHVlXSkgPT4gKHZhbHVlID4gMSA/IFtrZXldIDogW10pLFxuKTtcbmlmIChkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMubGVuZ3RoID4gMCkge1xuICBjb25zdCBtc2cgPSBgRHVwbGljYXRlIGtlcm5lbCBzdGF0cyBrZXlzICR7SlNPTi5zdHJpbmdpZnkoZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzKX1gO1xuICB0aHJvdyBFcnJvcihtc2cpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSElTVE9HUkFNX01FVFJJQ1MiOlsiSElTVE9HUkFNX01FVFJJQ1MiXSwiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiOlsiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiXSwiUXVldWVNZXRyaWNBc3BlY3QiOlsiUXVldWVNZXRyaWNBc3BlY3QiXSwibWFrZVF1ZXVlTWV0cmljc01ldGEiOlsibWFrZVF1ZXVlTWV0cmljc01ldGEiXSwibWFrZVF1ZXVlTWV0cmljcyI6WyJtYWtlUXVldWVNZXRyaWNzIl0sIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiXSwiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyJdLCJLRVJORUxfU1RBVFNfTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfTUVUUklDUyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKuVrytg4AALYOAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL25hdHVyYWwtc29ydC5qc3siaW1wb3J0cyI6WyIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibmF0dXJhbENvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwcm92aWRlTGF6eU1hcDskaM2PX2ltcG9ydHMoW1tcIi4vanMtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5TWFwXCIsWyRozY9fYSA9PiAocHJvdmlkZUxhenlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhXG4gKiBAcGFyYW0ge3N0cmluZ30gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVOYXRzID0gKGEsIGIpID0+IHtcbiAgLyogRGVmYXVsdCB0byBJRUVFIDc1NCBudW1iZXIgYXJpdGhtZXRpYyBmb3Igc3BlZWQsIGJ1dCBmYWxsIGJhY2sgb24gYmlnaW50Ki9cbiAgLyogYXJpdGhtZXRpYyB0byByZXNvbHZlIHRpZXMgYmVjYXVzZSBiaWcgbnVtYmVycyBjYW4gbG9zZSByZXNvbHV0aW9uKi9cbiAgLyogKHNvbWV0aW1lcyBldmVuIGJlY29taW5nIGluZmluaXRlKSBhbmQgdGhlbiB1bHRpbWF0ZWx5IG9uIGxlbmd0aCB0byByZXNvbHZlKi9cbiAgLyogdGllcyBieSBhc2NlbmRpbmcgY291bnQgb2YgbGVhZGluZyB6ZXJvcy4qL1xuICBjb25zdCBkaWZmID0gK2EgLSArYjtcbiAgY29uc3QgZmluaXRlRGlmZiA9XG4gICAgKE51bWJlci5pc0Zpbml0ZShkaWZmKSAmJiBkaWZmKSB8fFxuICAgIChhID09PSBiID8gMCA6IE51bWJlcihCaWdJbnQoYSkgLSBCaWdJbnQoYikpIHx8IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBjYWxsIHJlYWxseSBkb2VzIHJldHVybiAtMSB8IDAgfCAxKi9cbiAgcmV0dXJuIE1hdGguc2lnbihmaW5pdGVEaWZmKTtcbn07XG5cbi8qIFRPRE86IGNvbXBhcmVCeUNvZGVQb2ludHMqL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjAwOCovXG5cbmNvbnN0IGNvbXBhcmVTdHJpbmdzID0gKGEsIGIpID0+IChhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMCk7XG5cbmNvbnN0IHJDYXB0dXJlRGlnaXRzID0gLyhbMC05XSspLztcblxuLyoqXG4gKiBTcGxpdHRpbmcgYnkgcmVndWxhciBleHByZXNzaW9uIGNhbiBiZSBleHBlbnNpdmU7IHdlIGRvbid0IHdhbnQgdG8gcmVwZWF0XG4gKiB0aGF0IGZvciBldmVyeSBjb21wYXJpc29uIGFnYWluc3QgdGhlIHNhbWUgc3RyaW5nLlxuICpcbiAqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59XG4gKi9cbmNvbnN0IHBhcnRzQ2FjaGUgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogUGVyZm9ybSBhIG11bHRpLWxldmVsIG5hdHVyYWwtc29ydCBjb21wYXJpc29uLCBmaW5kaW5nIHRoZSBkZWNpbWFsIGRpZ2l0XG4gKiBzZXF1ZW5jZXMgaW4gZWFjaCBvcGVyYW5kIGFuZCBjb21wYXJpbmcgZmlyc3QgYnkgZWFjaCAoW3Bvc3NpYmx5IGVtcHR5XVxuICogc3RyaW5nIHByZWZpeCwgaW50ZWdlcikgcGFpciBpbiB0dXJuLCB3aXRoIGEgZmluYWwgY29tcGFyaXNpb24gYnkgc3RyaW5nXG4gKiBzdWZmaXggYXMgbmVjZXNzYXJ5IChlLmcuLCBzb3J0aW5nICdrbzQyJyBiZWZvcmUgJ2tvMTAwJyBhcyBbJ2tvJywgNDJdIHZzLlxuICogWydrbycsIDEwMF0gYW5kICdwYXJlbnQxLmNoaWxkOCcgYmVmb3JlICdwYXJlbnQxLmNoaWxkMTAnIGFzIFsncGFyZW50JywgMSxcbiAqICdjaGlsZCcsIDhdIHZzLiBbJ3BhcmVudCcsIDEsICdjaGlsZCcsIDEwXSkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuICAgICAgIGNvbnN0IG5hdHVyYWxDb21wYXJlID0gKGEsIGIpID0+IHtcbiAgLyogV2Ugd2FudCB0byBtYWludGFpbiBhIGNhY2hlIG9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZiBlYWNoIGNhbGwgdG8qL1xuICAvKiBhcnJheS5zb3J0LCBhbmQgbGV2ZXJhZ2UgdGhlIHN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGF0IG1ldGhvZCBpbiB0aGUgZmlyc3QqL1xuICAvKiBpbnZvY2F0aW9uIG9mIGVhY2ggdHVybiAoaW5kaWNhdGVkIGJ5IGFuIGVtcHR5IGNhY2hlKSB0byBzY2hlZHVsZSBjYWNoZSovXG4gIC8qIGNsZWFyaW5nIGluIHRoZSAqbmV4dCogdHVybi4qL1xuICBpZiAoIXBhcnRzQ2FjaGUuc2l6ZSkgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHBhcnRzQ2FjaGUuY2xlYXIoKSk7XG5cbiAgY29uc3QgYVBhcnRzID0gcHJvdmlkZUxhenlNYXAocGFydHNDYWNoZSwgYSwgKCkgPT4gYS5zcGxpdChyQ2FwdHVyZURpZ2l0cykpO1xuICBjb25zdCBiUGFydHMgPSBwcm92aWRlTGF6eU1hcChwYXJ0c0NhY2hlLCBiLCAoKSA9PiBiLnNwbGl0KHJDYXB0dXJlRGlnaXRzKSk7XG5cbiAgLyogQW4gZXZlbiBpbmRleCBjb3JyZXNwb25kcyB3aXRoIGEgc3RyaW5nIHBhcnQ7IGFuIG9kZCBvbmUgd2l0aCBhIGRpZ2l0IHBhcnQuKi9cbiAgbGV0IGkgPSAwO1xuICBmb3IgKDsgaSArIDEgPCBhUGFydHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBpZiAoaSArIDEgPCBiUGFydHMubGVuZ3RoKSB7XG4gICAgICAvKiBCb3RoIGBhYCBhbmQgYGJgIGhhdmUgYSBkaWdpdCBwYXJ0IGhlcmUsIGJ1dCB3ZSBjb21wYXJlIHRoZSBwcmVjZWRpbmcqL1xuICAgICAgLyogc3RyaW5nIHBhcnQgZmlyc3QgaW4gY2FzZSB0aG9zZSBhcmUgdW5lcXVhbC4qL1xuICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBiUGFydHNbaV0pIHx8XG4gICAgICAgIGNvbXBhcmVOYXRzKGFQYXJ0c1tpICsgMV0sIGJQYXJ0c1tpICsgMV0pO1xuICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogQWZ0ZXIgYSAocG9zc2libHkgZW1wdHkpIGNvbW1vbiBwcmVmaXgsIGBhYCBoYXMgZGlnaXRzIHdoZXJlIGBiYCBkb2VzKi9cbiAgICAgIC8qIG5vdCwgc28gd2UgdXNlIHN0cmluZyBjb21wYXJpc29uIG9mIGAke2FTdHJpbmd9JHthRGlnaXRzfWAgdnMuKi9cbiAgICAgIC8qIGAke2JTdHJpbmd9YC4qL1xuICAgICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGAke2FQYXJ0c1tpXX0ke2FQYXJ0c1tpICsgMV19YCwgYlBhcnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgaWYgKGJQYXJ0cy5sZW5ndGggPiBhUGFydHMubGVuZ3RoKSB7XG4gICAgLyogYGJgIGhhcyBkaWdpdHMgd2hlcmUgYGFgIGRvZXMgbm90LiovXG4gICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGFQYXJ0c1tpXSwgYCR7YlBhcnRzW2ldfSR7YlBhcnRzW2kgKyAxXX1gKTtcbiAgfVxuICAvKiBJZiBgYWAgYW5kIGBiYCBkaWZmZXIsIGl0J3Mgb25seSBpbiB0aGUgZmluYWwgc3RyaW5nIHN1ZmZpeC4qL1xuICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBiUGFydHNbaV0pO1xufTskaM2PX29uY2UubmF0dXJhbENvbXBhcmUobmF0dXJhbENvbXBhcmUpO1xuaGFyZGVuKG5hdHVyYWxDb21wYXJlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdHVyYWxDb21wYXJlIjpbIm5hdHVyYWxDb21wYXJlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE/EJZdqSAAAakgAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc2VzLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vc3RyZWFtIiwiamVzc2llLmpzIiwiLi9qcy11dGlscy5qcyJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhbGxWYWx1ZXMiLCJhc3NlcnRBbGxEZWZpbmVkIiwiYXR0ZW51YXRlIiwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IiwiZm9yZXZlciIsImZyb21VbmlxdWVFbnRyaWVzIiwibWFrZUxpbWl0ZWRDb25zb2xlIiwib2JqZWN0TWFwIiwib2JqZWN0TWV0YU1hcCIsInN0cmlwUHJlZml4Iiwic3luY2hyb25pemVkVGVlIiwidGhyb3dFcnJvckNvZGUiLCJ0cnlKc29uUGFyc2UiLCJ0cnlOb3ciLCJ1bnRpbFRydWUiLCJ3aGlsZVRydWUiLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgb2JqZWN0TWFwLG9iamVjdE1ldGFNYXAsZnJvbVVuaXF1ZUVudHJpZXMscSxiLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsWCxkZWVwbHlGdWxmaWxsZWQsaXNQcmltaXRpdmUsbWFrZVByb21pc2VLaXQsbWFrZVF1ZXVlLGFzeW5jR2VuZXJhdGUsbG9nTGV2ZWxzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSksJGjNj19saXZlW1wib2JqZWN0TWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzXCIsIFtbXCJvYmplY3RNZXRhTWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWV0YU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wib2JqZWN0TWV0YU1hcFwiXV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpLCRozY9fbGl2ZVtcImZyb21VbmlxdWVFbnRyaWVzXCJdXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLFskaM2PX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9zdHJlYW1cIiwgW1tcIm1ha2VRdWV1ZVwiLFskaM2PX2EgPT4gKG1ha2VRdWV1ZSA9ICRozY9fYSldXV1dLFtcImplc3NpZS5qc1wiLCBbW1wiYXN5bmNHZW5lcmF0ZVwiLFskaM2PX2EgPT4gKGFzeW5jR2VuZXJhdGUgPSAkaM2PX2EpXV1dXSxbXCIuL2pzLXV0aWxzLmpzXCIsIFtbXCJsb2dMZXZlbHNcIixbJGjNj19hID0+IChsb2dMZXZlbHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGZyb21FbnRyaWVzLCBrZXlzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyoqIEBwYXJhbSB7KGxldmVsOiBzdHJpbmcpID0+ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWR9IG1ha2VMb2dnZXIgKi9cbiAgICAgICBjb25zdCBtYWtlTGltaXRlZENvbnNvbGUgPSBtYWtlTG9nZ2VyID0+IHtcbiAgY29uc3QgbGltaXRlZENvbnNvbGUgPSAvKiogQHR5cGUge2FueX0gKi8gKFxuICAgIGZyb21FbnRyaWVzKGxvZ0xldmVscy5tYXAobGV2ZWwgPT4gW2xldmVsLCBtYWtlTG9nZ2VyKGxldmVsKV0pKVxuICApO1xuICByZXR1cm4gLyoqIEB0eXBlIHtMaW1pdGVkQ29uc29sZX0gKi8gKGhhcmRlbihsaW1pdGVkQ29uc29sZSkpO1xufTskaM2PX29uY2UubWFrZUxpbWl0ZWRDb25zb2xlKG1ha2VMaW1pdGVkQ29uc29sZSk7XG5oYXJkZW4obWFrZUxpbWl0ZWRDb25zb2xlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgW0tleVR5cGUgaW4ga2V5b2YgVF06IFRbS2V5VHlwZV0gfSAmIHt9fSBTaW1wbGlmeSBmbGF0dGVuIHRoZVxuICogICB0eXBlIG91dHB1dCB0byBpbXByb3ZlIHR5cGUgaGludHMgc2hvd24gaW4gZWRpdG9yc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPjtcbiAqIH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT5cbiAqICAgICA/IEF3YWl0ZWQ8VD5cbiAqICAgICA6IFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxhbnksIGFueT4gfCBSZW1vdGFibGVPYmplY3RcbiAqICAgICAgID8gVFxuICogICAgICAgOiBUIGV4dGVuZHMge31cbiAqICAgICAgICAgPyBTaW1wbGlmeTxEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+PlxuICogICAgICAgICA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEEgbW9yZSBjb25zdHJhaW5lZCB2ZXJzaW9uIG9mIHtkZWVwbHlGdWxmaWxsZWR9IGZvciB0eXBlIHNhZmV0eSB1bnRpbFxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xMjU3IFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdFxuICogbmVlZCBhbGwgdGVybXMgdG8gYmUgZnVsZmlsbGVkIGluIG9yZGVyIHRvIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMge30+KHVuZnVsZmlsbGVkVGVybXM6IFQpID0+IFByb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbiAgICAgICBjb25zdCBkZWVwbHlGdWxmaWxsZWRPYmplY3QgPSBhc3luYyBvYmogPT4ge1xuICAhaXNQcmltaXRpdmUob2JqKSB8fCBGYWlsYHBhcmFtIG11c3QgYmUgYW4gb2JqZWN0YDtcbiAgcmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xufTtcblxuLyoqXG4gKiBUb2xlcmF0ZSBhYnNlbmNlIG9mIEFnZ3JlZ2F0ZUVycm9yIGluIGUuZy4geHNuYXAuXG4gKlxuICogQHR5cGUgeyhlcnJvcnM6IEVycm9yW10sIG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBvYmplY3QpID0+IEVycm9yfVxuICovJGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZE9iamVjdChkZWVwbHlGdWxmaWxsZWRPYmplY3QpO1xuY29uc3QgbWFrZUFnZ3JlZ2F0ZUVycm9yID1cbiAgdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgPyAoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKSA9PiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgOiAoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBtYWtlRXJyb3IobWVzc2FnZSA/PyAnbXVsdGlwbGUgZXJyb3JzJywgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBlcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCBhIHN0cmluZyBoYXMgYSBwcmVmaXgsIGFuZCByZXR1cm4gdGhlIHBhcnQgdGhhdCBmb2xsb3dzIGl0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBzdHJpcFByZWZpeCA9IChwcmVmaXgsIHN0cikgPT4ge1xuICBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIHx8IEZhaWxgJHtzdHJ9IGlzIG1pc3NpbmcgcHJlZml4ICR7cShwcmVmaXgpfWA7XG4gIHJldHVybiBzdHIuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG59O1xuXG4vKipcbiAqIFRocm93IGFuIGVycm9yIHdpdGggYW4gb3duIFwiY29kZVwiIGRhdGEgcHJvcGVydHksIHN1cHBvcnRpbmcgaWRlbnRpZmljYXRpb25cbiAqIHdpdGhvdXQgcGFyc2luZyBgbWVzc2FnZWAuIE5vdGUgdGhhdCBzdWNoIGVycm9ycyBhcmUgbm90IFBhc3NhYmxlIGFuZCB0aHVzXG4gKiBjYW5ub3QgYXBwZWFyIGluc2lkZSBhIFBhc3NhYmxlIHN0cnVjdHVyZSwgYW5kIGV2ZW4gYXQgdG9wIGxldmVsIHRoZSBcImNvZGVcIlxuICogcHJvcGVydHkgd2lsbCBiZSBzaWxlbnRseSBkcm9wcGVkIGJ5IG1hcnNoYWxsaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBDb2RlXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIG1ha2VFcnJvcj5bMF19IGRldGFpbHNcbiAqIEBwYXJhbSB7Q29kZX0gY29kZVxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBtYWtlRXJyb3I+WzJdICYge1xuICogICBjb25zdHJ1Y3Rvcj86IFBhcmFtZXRlcnM8dHlwZW9mIG1ha2VFcnJvcj5bMV07XG4gKiB9fSBbb3B0c11cbiAqLyRozY9fb25jZS5zdHJpcFByZWZpeChzdHJpcFByZWZpeCk7XG4gICAgICAgY29uc3QgdGhyb3dFcnJvckNvZGUgPSAoZGV0YWlscywgY29kZSwgb3B0cykgPT4ge1xuICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoZGV0YWlscywgb3B0cz8uY29uc3RydWN0b3IsIHtcbiAgICAuLi5vcHRzLFxuICAgIHNhbml0aXplOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICdjb2RlJywgeyB2YWx1ZTogY29kZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgaGFyZGVuKGVycik7XG4gIHRocm93IGVycjtcbn07XG5cbi8qKlxuICogU3luY2hyb251c2x5IGludm9rZSBhIGZ1bmN0aW9uIHdpdGggdGhlIG9wcG9ydHVuaXR5IHRvIGhhbmRsZSBhbnkgZXJyb3JcbiAqIHNpbWlsYXJseSB0byBhIFByb21pc2UgYGNhdGNoYCBjYWxsYmFjayAoZS5nLiwgc3Vic3RpdHV0aW5nIGEgbm9uLWVycm9yXG4gKiByZXR1cm5lZCB2YWx1ZSBvciB0aHJvd2luZyBhIHBvc3NpYmx5LW5ldyBlcnJvcikuIFRoaXMgaXMgdXNlZnVsIGZvciAoYW1vbmdcbiAqIG90aGVyIHRoaW5ncykgcmVwbGFjaW5nIGdlbmVyaWMgZXJyb3IgbWVzc2FnZXMgd2l0aCBzcGVjaWZpYyBvbmVzIChhcyBpblxuICoge0BzZWUgdHJ5SnNvblBhcnNlfSkuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gRlxuICogQHRlbXBsYXRlIFtVPVJldHVyblR5cGU8Rj5dXG4gKiBAcGFyYW0ge0Z9IGZuIHRvIGludm9rZVxuICogQHBhcmFtIHsoZXJyOiBFcnJvcikgPT4gVX0gdHJhbnNmb3JtRXJyb3IgY2FsbGJhY2sgdG8gcmVjZWl2ZSBhbnkgZXJyb3IgZnJvbVxuICogICBpbnZva2luZyBgZm5gIGFuZCBlaXRoZXIgcmV0dXJuIGEgc3Vic3RpdHV0ZSB2YWx1ZSBvciB0aHJvdyBhIHBvdGVudGlhbGx5XG4gKiAgIG5ldyBlcnJvclxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEY+fSBhcmdzIGZvciBgZm5gXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxGPiB8IFV9XG4gKi8kaM2PX29uY2UudGhyb3dFcnJvckNvZGUodGhyb3dFcnJvckNvZGUpO1xuICAgICAgIGNvbnN0IHRyeU5vdyA9IChmbiwgdHJhbnNmb3JtRXJyb3IsIC4uLmFyZ3MpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtRXJyb3IoZXJyKTtcbiAgICB9IGNhdGNoIChuZXdFcnIpIHtcbiAgICAgIC8qIFRyeSB0byBhc3NvY2lhdGUgYGVycmAgd2l0aCBgbmV3RXJyYC4qL1xuICAgICAgaWYgKCFuZXdFcnIuY2F1c2UpIHtcbiAgICAgICAgY29uc3QgZGVzYyA9IHtcbiAgICAgICAgICB2YWx1ZTogZXJyLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFSZWZsZWN0LmRlZmluZVByb3BlcnR5KG5ld0VyciwgJ2NhdXNlJywgZGVzYykpIHtcbiAgICAgICAgICBhc3NlcnQubm90ZShuZXdFcnIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3RXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQYXJzZSBKU09OIHRleHQsIG9yIGhhbmRsZSBhbiBlcnJvciBieSBlLmcuIHN1YnN0aXR1dGluZyBhIGRlZmF1bHQgdmFsdWUgb3JcbiAqIHJlcGxhY2luZyBpdCB3aXRoIG9uZSBiZWFyaW5nIGEgbm9uLWdlbmVyaWMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ganNvblRleHRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgKChlcnI6IEVycm9yKSA9PiB1bmtub3duKX0gb25FcnJvciBhbiBlcnJvciBtZXNzYWdlIG9yXG4gKiAgIGNhbGxiYWNrXG4gKi8kaM2PX29uY2UudHJ5Tm93KHRyeU5vdyk7XG4gICAgICAgY29uc3QgdHJ5SnNvblBhcnNlID0gKGpzb25UZXh0LCBvbkVycm9yKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybUVycm9yID1cbiAgICB0eXBlb2Ygb25FcnJvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBvbkVycm9yXG4gICAgICA6IGVyciA9PiBGYWlsKFtgJHtvbkVycm9yfTogJHtlcnIubWVzc2FnZX0gZm9yIGlucHV0IGAsICcnXSwganNvblRleHQpO1xuICByZXR1cm4gdHJ5Tm93KCgpID0+IHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGpzb25UZXh0O1xuICAgIHR5cGUgPT09ICdzdHJpbmcnIHx8IEZhaWxgSW5wdXQgbXVzdCBiZSBhIHN0cmluZywgbm90ICR7Yih0eXBlKX1gO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgfSwgdHJhbnNmb3JtRXJyb3IpO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtyZWFkb25seSAoVCB8IFByb21pc2VMaWtlPFQ+KVtdfSBpdGVtc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRozY9fb25jZS50cnlKc29uUGFyc2UodHJ5SnNvblBhcnNlKTtcbiAgICAgICBjb25zdCBQcm9taXNlQWxsT3JFcnJvcnMgPSBhc3luYyBpdGVtcyA9PiB7XG4gIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaXRlbXMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgY29uc3QgZXJyb3JzID0gLyoqIEB0eXBlIHtQcm9taXNlUmVqZWN0ZWRSZXN1bHRbXX0gKi8gKFxuICAgICAgcmVzdWx0cy5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cyA9PT0gJ3JlamVjdGVkJylcbiAgICApLm1hcChyZXN1bHQgPT4gcmVzdWx0LnJlYXNvbik7XG4gICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+W119ICovIChyZXN1bHRzKS5tYXAoXG4gICAgICAgIHJlc3VsdCA9PiByZXN1bHQudmFsdWUsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBtYWtlQWdncmVnYXRlRXJyb3IoZXJyb3JzKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSB0cmllclxuICogQHBhcmFtIHsoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+fSBmaW5hbGl6ZXJcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHRyaWVyPn1cbiAqLyRozY9fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtcbiAgICAgICBjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5ID0gYXN5bmMgKHRyaWVyLCBmaW5hbGl6ZXIpID0+XG4gIHRyaWVyKCkudGhlbihcbiAgICBhc3luYyByZXN1bHQgPT4gZmluYWxpemVyKCkudGhlbigoKSA9PiByZXN1bHQpLFxuICAgIGFzeW5jIHRyeUVycm9yID0+XG4gICAgICBmaW5hbGl6ZXIodHJ5RXJyb3IpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgICgpID0+IHRyeUVycm9yLFxuICAgICAgICAgIGZpbmFsaXplRXJyb3IgPT4gbWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvciwgZmluYWxpemVFcnJvcl0pLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSksXG4gICk7XG5cbi8qKlxuICogUnVuIGEgZnVuY3Rpb24gd2l0aCB0aGUgYWJpbGl0eSB0byBkZWZlciBsYXN0LWluLWZpcnN0LW91dCBjbGVhbnVwIGNhbGxiYWNrcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoXG4gKiAgIGFkZENsZWFudXA6IChmbjogKGVycj86IHVua25vd24pID0+IFByb21pc2U8dm9pZD4pID0+IHZvaWQsXG4gKiApID0+IFByb21pc2U8VD59IGZuXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxmbj59XG4gKi8kaM2PX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbiAgICAgICBjb25zdCB3aXRoRGVmZXJyZWRDbGVhbnVwID0gYXN5bmMgZm4gPT4ge1xuICAvKiogQHR5cGUgeygoZXJyPzogdW5rbm93bikgPT4gdW5rbm93bilbXX0gKi9cbiAgY29uc3QgY2xlYW51cHNMSUZPID0gW107XG4gIC8qKiBAdHlwZSB7KGNsZWFudXA6IChlcnI/OiB1bmtub3duKSA9PiB1bmtub3duKSA9PiB2b2lkfSAqL1xuICBjb25zdCBhZGRDbGVhbnVwID0gY2xlYW51cCA9PiB7XG4gICAgY2xlYW51cHNMSUZPLnVuc2hpZnQoY2xlYW51cCk7XG4gIH07XG4gIC8qKiBAdHlwZSB7KGVycj86IHVua25vd24pID0+IFByb21pc2U8dm9pZD59ICovXG4gIGNvbnN0IGZpbmFsaXplciA9IGFzeW5jIGVyciA9PiB7XG4gICAgLyogUnVuIGVhY2ggY2xlYW51cCBpbiBpdHMgb3duIGlzb2xhdGVkIHN0YWNrLiovXG4gICAgY29uc3QgY2xlYW51cFJlc3VsdHMgPSBjbGVhbnVwc0xJRk8ubWFwKGFzeW5jIGNsZWFudXAgPT4ge1xuICAgICAgYXdhaXQgbnVsbDtcbiAgICAgIHJldHVybiBjbGVhbnVwKGVycik7XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZUFsbE9yRXJyb3JzKGNsZWFudXBSZXN1bHRzKTtcbiAgfTtcbiAgcmV0dXJuIGFnZ3JlZ2F0ZVRyeUZpbmFsbHkoKCkgPT4gZm4oYWRkQ2xlYW51cCksIGZpbmFsaXplcik7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFRcbiAqIEB0eXBlZGVmIHt7IFtQIGluIGtleW9mIFRdOiBFeGNsdWRlPFRbUF0sIHVuZGVmaW5lZD4gfX0gQWxsRGVmaW5lZFxuICovXG5cbi8qKlxuICogQ29uY2lzZSB3YXkgdG8gY2hlY2sgdmFsdWVzIGFyZSBhdmFpbGFibGUgZnJvbSBvYmplY3QgbGl0ZXJhbCBzaG9ydGhhbmQuXG4gKiBUaHJvd3MgZXJyb3IgbWVzc2FnZSB0byBzcGVjaWZ5IHRoZSBtaXNzaW5nIHZhbHVlcy5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKSA9PiBhc3NlcnRzIG9iaiBpcyBBbGxEZWZpbmVkPFQ+fVxuICogQHRocm93cyBpZiBhbnkgdmFsdWUgaW4gdGhlIG9iamVjdCBlbnRyaWVzIGlzIG5vdCBkZWZpbmVkXG4gKi8kaM2PX29uY2Uud2l0aERlZmVycmVkQ2xlYW51cCh3aXRoRGVmZXJyZWRDbGVhbnVwKTtcbiAgICAgICBjb25zdCBhc3NlcnRBbGxEZWZpbmVkID0gb2JqID0+IHtcbiAgY29uc3QgbWlzc2luZyA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWlzc2luZy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICBGYWlsYG1pc3NpbmcgJHtxKG1pc3NpbmcpfWA7XG4gIH1cbn07XG5cbi8qKlxuICogQXR0ZW51YXRlIGBzcGVjaW1lbmAgdG8gb25seSBwcm9wZXJ0aWVzIGFsbG93ZWQgYnkgYHBlcm1pdGAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UGVybWl0PFQ+fSBQXG4gKiBAcGFyYW0ge1R9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1B9IHBlcm1pdFxuICogQHBhcmFtIHs8VSwgU3ViUCBleHRlbmRzIFBlcm1pdDxVPj4oYXR0ZW51YXRpb246IFUsIHBlcm1pdDogU3ViUCkgPT4gVX0gW3RyYW5zZm9ybV1cbiAqICAgdXNlZCB0byByZXBsYWNlIHRoZSByZXN1bHRzIG9mIHJlY3Vyc2l2ZSBwaWNrcyAoYnV0IG5vdCBibGFua2V0IHBlcm1pdHMpXG4gKiBAcmV0dXJucyB7QXR0ZW51YXRlZDxULCBQPn1cbiAqLyRozY9fb25jZS5hc3NlcnRBbGxEZWZpbmVkKGFzc2VydEFsbERlZmluZWQpO1xuICAgICAgIGNvbnN0IGF0dGVudWF0ZSA9IChzcGVjaW1lbiwgcGVybWl0LCB0cmFuc2Zvcm0gPSB4ID0+IHgpID0+IHtcbiAgLyogRmFzdC1wYXRoIGZvciBubyBhdHRlbnVhdGlvbi4qL1xuICBpZiAocGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBwZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7QXR0ZW51YXRlZDxULCBQPn0gKi8gKHNwZWNpbWVuKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHBhdGggPSBbXTtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgU3ViVFxuICogQHRlbXBsYXRlIHtFeGNsdWRlPFBlcm1pdDxTdWJUPiwgUHJpbWl0aXZlPn0gU3ViUFxuICogQHR5cGUgeyhzcGVjaW1lbjogU3ViVCwgcGVybWl0OiBTdWJQKSA9PiBBdHRlbnVhdGVkPFN1YlQsIFN1YlA+fVxuICovXG4gIGNvbnN0IGV4dHJhY3QgPSAoc3ViU3BlY2ltZW4sIHN1YlBlcm1pdCkgPT4ge1xuICAgIGlmIChzdWJQZXJtaXQgPT09IG51bGwgfHwgdHlwZW9mIHN1YlBlcm1pdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHBhdGgubGVuZ3RoID09PSAwXG4gICAgICAgID8gRmFpbGBpbnZhbGlkIHBlcm1pdDogJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgaW52YWxpZCBwZXJtaXQgYXQgcGF0aCAke3EocGF0aCl9OiAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH0gZWxzZSBpZiAoc3ViU3BlY2ltZW4gPT09IG51bGwgfHwgdHlwZW9mIHN1YlNwZWNpbWVuICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBGYWlsYHNwZWNpbWVuIG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgc3BlY2ltZW4gYXQgcGF0aCAke3EocGF0aCl9IG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHN1YlBlcm1pdCl9YDtcbiAgICB9XG4gICAgY29uc3QgcGlja3MgPSBPYmplY3QuZW50cmllcyhzdWJQZXJtaXQpLm1hcCgoW3N1YktleSwgZGVlcFBlcm1pdF0pID0+IHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihzdWJTcGVjaW1lbiwgc3ViS2V5KSkge1xuICAgICAgICB0aHJvdyBGYWlsYHNwZWNpbWVuIGlzIG1pc3NpbmcgcGF0aCAke3EocGF0aC5jb25jYXQoc3ViS2V5KSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlZXBTcGVjaW1lbiA9IFJlZmxlY3QuZ2V0KHN1YlNwZWNpbWVuLCBzdWJLZXkpO1xuICAgICAgaWYgKGRlZXBQZXJtaXQgPT09IHRydWUgfHwgdHlwZW9mIGRlZXBQZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbc3ViS2V5LCBkZWVwU3BlY2ltZW5dO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKHN1YktleSk7XG4gICAgICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0KC8qKiBAdHlwZSB7YW55fSAqLyAoZGVlcFNwZWNpbWVuKSwgZGVlcFBlcm1pdCk7XG4gICAgICBjb25zdCBlbnRyeSA9IFtzdWJLZXksIGV4dHJhY3RlZF07XG4gICAgICBwYXRoLnBvcCgpO1xuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2Zvcm0oT2JqZWN0LmZyb21FbnRyaWVzKHBpY2tzKSwgc3ViUGVybWl0KTtcbiAgfTtcblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICByZXR1cm4gZXh0cmFjdChzcGVjaW1lbiwgcGVybWl0KTtcbn07XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8dW5kZWZpbmVkLCBuZXZlcj59ICovJGjNj19vbmNlLmF0dGVudWF0ZShhdHRlbnVhdGUpO1xuY29uc3Qgbm90RG9uZSA9IGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PG5ldmVyLCB2b2lkPn0gKi9cbmNvbnN0IGFsd2F5c0RvbmUgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4gICAgICAgY29uc3QgZm9yZXZlciA9IGFzeW5jR2VuZXJhdGUoKCkgPT4gbm90RG9uZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZSBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzXG4gKiAgIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZFxuICogICBub3QgYm90aGVyIGRvaW5nIHRoaXMgdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjNj19vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG4gICAgICAgY29uc3Qgd2hpbGVUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gYWx3YXlzRG9uZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHNcbiAqICAgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkXG4gKiAgIG5vdCBib3RoZXIgZG9pbmcgdGhpcyB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaM2PX29uY2Uud2hpbGVUcnVlKHdoaWxlVHJ1ZSk7XG4gICAgICAgY29uc3QgdW50aWxUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH0pO1xuXG4vKiogQHR5cGUgezxYLCBZPih4czogWFtdLCB5czogWVtdKSA9PiBbWCwgWV1bXX0gKi8kaM2PX29uY2UudW50aWxUcnVlKHVudGlsVHJ1ZSk7XG4gICAgICAgY29uc3QgemlwID0gKHhzLCB5cykgPT4gaGFyZGVuKHhzLm1hcCgoeCwgaSkgPT4gW3gsIHlzWytpXV0pKTtcblxuLyoqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBFUmVmPGFueT4+PihcbiAqICAgb2JqOiBULFxuICogKSA9PiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtLXT4gfT59XG4gKi8kaM2PX29uY2UuemlwKHppcCk7XG4gICAgICAgY29uc3QgYWxsVmFsdWVzID0gYXN5bmMgb2JqID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLmFsbCh2YWx1ZXMob2JqKSk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMoemlwKGtleXMob2JqKSwgcmVzb2x2ZWQpKSk7XG59O1xuXG4vKipcbiAqIEEgdGVlIGltcGxlbWVudGF0aW9uIHdoZXJlIGFsbCByZWFkZXJzIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLiBUaGV5XG4gKiBhbGwgY29uc3VtZSB0aGUgc291cmNlIHN0cmVhbSBpbiBsb2Nrc3RlcCwgYW5kIGFueSBvbmUgcmV0dXJuaW5nIG9yIHRocm93aW5nXG4gKiBlYXJseSB3aWxsIGFmZmVjdCB0aGUgb3RoZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtBc3luY0l0ZXJhdG9yPFQsIHZvaWQsIHZvaWQ+fSBzb3VyY2VTdHJlYW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByZWFkZXJDb3VudFxuICovJGjNj19vbmNlLmFsbFZhbHVlcyhhbGxWYWx1ZXMpO1xuICAgICAgIGNvbnN0IHN5bmNocm9uaXplZFRlZSA9IChzb3VyY2VTdHJlYW0sIHJlYWRlckNvdW50KSA9PiB7XG4gIC8qKiBAdHlwZSB7SXRlcmF0b3JSZXR1cm5SZXN1bHQ8dm9pZD4gfCB1bmRlZmluZWR9ICovXG4gIGxldCBkb25lUmVzdWx0O1xuXG4gIC8qKlxuICogQHR5cGVkZWYge0l0ZXJhdG9yUmVzdWx0PFxuICogICAodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZFxuICogPn0gUXVldWVQYXlsb2FkXG4gKi9cbiAgLyoqIEB0eXBlIHtBc3luY1F1ZXVlPFF1ZXVlUGF5bG9hZD5bXX0gKi9cbiAgY29uc3QgcXVldWVzID0gW107XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBjb25zdCBwdWxsTmV4dCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZXMubWFwKHF1ZXVlID0+IHF1ZXVlLmdldCgpKSk7XG4gICAgY29uc3QgcmVqZWN0aW9ucyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7QXJyYXk8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSAqL1xuICAgIGNvbnN0IHJlc29sdmVycyA9IFtdO1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBzZXR0bGVkUmVzdWx0IG9mIHJlcXVlc3RzKSB7XG4gICAgICBpZiAoc2V0dGxlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgcmVqZWN0aW9ucy5wdXNoKHNldHRsZWRSZXN1bHQucmVhc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUgfHw9ICEhc2V0dGxlZFJlc3VsdC52YWx1ZS5kb25lO1xuICAgICAgICByZXNvbHZlcnMucHVzaChzZXR0bGVkUmVzdWx0LnZhbHVlLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChkb25lUmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSBQcm9taXNlLnJlc29sdmUoZG9uZVJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChyZWplY3Rpb25zLmxlbmd0aCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBtYWtlRXJyb3IoWGBUZWVkIHN0cmVhbSB0aHJld2ApO1xuICAgICAgYW5ub3RhdGVFcnJvcihlcnJvciwgWGBUZWVkIHJlamVjdGlvbnM6ICR7cmVqZWN0aW9uc31gKTtcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHNvdXJjZVN0cmVhbS50aHJvdz8uKGVycm9yKSB8fFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCkgPT5cbiAgICAgICAgICBQcm9taXNlLnJlamVjdChlcnJvciksXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChkb25lKSB7XG4gICAgICByZXN1bHQgPVxuICAgICAgICBzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSB8fFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBzb3VyY2VTdHJlYW0ubmV4dCgpO1xuICAgIH1cbiAgICByZXN1bHQudGhlbihcbiAgICAgIHIgPT4ge1xuICAgICAgICBpZiAoci5kb25lKSB7XG4gICAgICAgICAgZG9uZVJlc3VsdCA9IHI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGRvbmVSZXN1bHQgPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJlc29sdmUgb2YgcmVzb2x2ZXJzKSB7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiBwdWxsTmV4dCgpO1xuICB9O1xuXG4gIGNvbnN0IHJlYWRlcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiByZWFkZXJDb3VudCB9KS5tYXAoKCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7QXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+fSAqL1xuICAgIGNvbnN0IHF1ZXVlID0gbWFrZVF1ZXVlKCk7XG4gICAgcXVldWVzLnB1c2gocXVldWUpO1xuXG4gICAgLyoqIEB0eXBlIHtBc3luY0dlbmVyYXRvcjxULCB2b2lkLCB2b2lkPn0gKi9cbiAgICBjb25zdCByZWFkZXIgPSBoYXJkZW4oe1xuICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgLyoqXG4gKiBAdHlwZSB7UHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59XG4gKi9cbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgICBxdWV1ZS5wdXQoeyB2YWx1ZTogcmVzb2x2ZSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHJldHVybigpIHtcbiAgICAgICAgLyoqXG4gKiBAdHlwZSB7UHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59XG4gKi9cbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgICBxdWV1ZS5wdXQoeyB2YWx1ZTogcmVzb2x2ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIHF1ZXVlLnB1dChyZWplY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVqZWN0aW9uO1xuICAgICAgfSxcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICAgIH0sXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbiAgICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyLnJldHVybigpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9KTtcblxuICB2b2lkIHB1bGxOZXh0KCk7XG4gIHJldHVybiByZWFkZXJzO1xufTskaM2PX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIixmYWxzZV0sIm9iamVjdE1ldGFNYXAiOlsib2JqZWN0TWV0YU1hcCIsZmFsc2VdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMaW1pdGVkQ29uc29sZSI6WyJtYWtlTGltaXRlZENvbnNvbGUiXSwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IjpbImRlZXBseUZ1bGZpbGxlZE9iamVjdCJdLCJzdHJpcFByZWZpeCI6WyJzdHJpcFByZWZpeCJdLCJ0aHJvd0Vycm9yQ29kZSI6WyJ0aHJvd0Vycm9yQ29kZSJdLCJ0cnlOb3ciOlsidHJ5Tm93Il0sInRyeUpzb25QYXJzZSI6WyJ0cnlKc29uUGFyc2UiXSwiUHJvbWlzZUFsbE9yRXJyb3JzIjpbIlByb21pc2VBbGxPckVycm9ycyJdLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IjpbImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiXSwid2l0aERlZmVycmVkQ2xlYW51cCI6WyJ3aXRoRGVmZXJyZWRDbGVhbnVwIl0sImFzc2VydEFsbERlZmluZWQiOlsiYXNzZXJ0QWxsRGVmaW5lZCJdLCJhdHRlbnVhdGUiOlsiYXR0ZW51YXRlIl0sImZvcmV2ZXIiOlsiZm9yZXZlciJdLCJ3aGlsZVRydWUiOlsid2hpbGVUcnVlIl0sInVudGlsVHJ1ZSI6WyJ1bnRpbFRydWUiXSwiemlwIjpbInppcCJdLCJhbGxWYWx1ZXMiOlsiYWxsVmFsdWVzIl0sInN5bmNocm9uaXplZFRlZSI6WyJzeW5jaHJvbml6ZWRUZWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2ojbK9YDAADWAwAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90bXBEaXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VUZW1wRGlyRmFjdG9yeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIENyZWF0ZSBhIGB0bXBEaXJgIGZ1bmN0aW9uIHRoYXQgc3luY2hyb25vdXNseSBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeVxuICogYW5kIGEgZnVuY3Rpb24gZm9yIGRlbGV0aW5nIGl0IGFsb25nIHdpdGggYW55IGFkZGVkIGNvbnRlbnRzLlxuICpcbiAqIEBwYXJhbSB7UGljazxJTVBPUlQoJ3RtcCcpLCAnZGlyU3luYyc+fSB0bXBcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUZW1wRGlyRmFjdG9yeSA9IHRtcCA9PiB7XG4gIC8qKiBAdHlwZSB7KHByZWZpeD86IHN0cmluZykgPT4gW2Rpck5hbWU6IHN0cmluZywgY2xlYW51cDogKCkgPT4gdm9pZF19ICovXG4gIGNvbnN0IHRtcERpciA9IHByZWZpeCA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCByZW1vdmVDYWxsYmFjayB9ID0gdG1wLmRpclN5bmMoe1xuICAgICAgcHJlZml4LFxuICAgICAgdW5zYWZlQ2xlYW51cDogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gW25hbWUsIHJlbW92ZUNhbGxiYWNrXTtcbiAgfTtcbiAgcmV0dXJuIHRtcERpcjtcbn07JGjNj19vbmNlLm1ha2VUZW1wRGlyRmFjdG9yeShtYWtlVGVtcERpckZhY3RvcnkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRlbXBEaXJGYWN0b3J5IjpbIm1ha2VUZW1wRGlyRmFjdG9yeSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOYqeWoQQAAKEEAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhc3QiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNdXN0TWF0Y2gsIFBhdHRlcm5UeXBlLCBUeXBlZFBhdHRlcm59IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKiBAdHlwZSB7TXVzdE1hdGNofSAqL1xuICAgICAgIGNvbnN0IG11c3RNYXRjaCA9IHR5cGVsZXNzTXVzdE1hdGNoO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBNXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1R5cGVkUGF0dGVybjxNPn0gcGF0dFxuICogQHJldHVybnMge019XG4gKi8kaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG4gICAgICAgY29uc3QgY2FzdCA9IChzcGVjaW1lbiwgcGF0dCkgPT4ge1xuICAvKiBtdXN0TWF0Y2ggdGhyb3dzIGlmIHRoZXkgZG9uJ3QsIHdoaWNoIG1lYW5zIHRoYXQgYGNhc3RgIGFsc28gbmFycm93cyB0aGUqL1xuICAvKiB0eXBlIGJ1dCBhIGZ1bmN0aW9uIGNhbid0IGJvdGggbmFycm93IGFuZCByZXR1cm4gYSB0eXBlLiBUaGF0IGlzIGJ5IGRlc2lnbjoqL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM0NjM2I2lzc3VlY29tbWVudC01NDUwMjU5MTYqL1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIHBhdHQpO1xuICByZXR1cm4gc3BlY2ltZW47XG59OyRozY9fb25jZS5jYXN0KGNhc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJjYXN0IjpbImNhc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq3x1xKMFAACjBQAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQnJpZGdlQmlnSW50U2hhcGUiLCJTdG9yYWdlTm9kZVNoYXBlIiwiVW5ndWFyZGVkSGVscGVySSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IFN0b3JhZ2VOb2RlU2hhcGUgPSBNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKTtcblxuLyoqIFRvIGJlIHVzZWQgb25seSBmb3IgJ2hlbHBlcicgZmFjZXRzIHdoZXJlIHRoZSBjYWxscyBhcmUgZnJvbSB0cnVzdGVkIGNvZGUuICovJGjNj19vbmNlLlN0b3JhZ2VOb2RlU2hhcGUoU3RvcmFnZU5vZGVTaGFwZSk7XG4gICAgICAgY29uc3QgVW5ndWFyZGVkSGVscGVySSA9IE0uaW50ZXJmYWNlKFxuICAnaGVscGVyJyxcbiAge30sXG4gIC8qIG5vdCBleHBvc2VkIHNvIHVzaW5nIGBkZWZhdWx0R3VhcmRzYCBpcyBmaW5lLiovXG4gIHsgZGVmYXVsdEd1YXJkczogJ3Bhc3NhYmxlJyB9LFxuKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7bnVtYmVyIHwgYCR7YmlnaW50fWB9IEJyaWRnZUJpZ0ludCBFbnN1cmUgdGhhdCBjYWxsZWVzIHBhc3NlZCBhXG4gKiAgIGJyaWRnZSBtZXNzYWdlIHRoYXQgd2FzIHNlcmlhbGlzZWQgZnJvbSBhIEdvbGFuZyBpbnQ2NCBvciB1aW50NjQgYWNjZXB0XG4gKiAgIGVpdGhlciBhIEpTIG51bWJlciBvciBhIHN0cmluZ2lmaWVkIEpTIGJpZ2ludC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtUeXBlZFBhdHRlcm48QnJpZGdlQmlnSW50Pn1cbiAqLyRozY9fb25jZS5Vbmd1YXJkZWRIZWxwZXJJKFVuZ3VhcmRlZEhlbHBlckkpO1xuICAgICAgIGNvbnN0IEJyaWRnZUJpZ0ludFNoYXBlID0gTS5vcihNLm51bWJlcigpLCBNLnN0cmluZygpKTskaM2PX29uY2UuQnJpZGdlQmlnSW50U2hhcGUoQnJpZGdlQmlnSW50U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl0sIlVuZ3VhcmRlZEhlbHBlckkiOlsiVW5ndWFyZGVkSGVscGVySSJdLCJCcmlkZ2VCaWdJbnRTaGFwZSI6WyJCcmlkZ2VCaWdJbnRTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANeHGT1wDAAAcAwAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIiwiaXNBYmFuZG9uZWRFcnJvciIsImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLG1hdGNoZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGlzRnJvemVuIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIHVzZSBhcyB0aGUgcmVqZWN0aW9uIHJlYXNvbiBvZiBwcm9taXNlcyBhYmFuZG9uZWQgYnlcbiAqIHVwZ3JhZGUuXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgbmFtZTogJ3ZhdFVwZ3JhZGVkJztcbiAqICAgdXBncmFkZU1lc3NhZ2U6IHN0cmluZztcbiAqICAgaW5jYXJuYXRpb25OdW1iZXI6IG51bWJlcjtcbiAqIH19IFVwZ3JhZGVEaXNjb25uZWN0aW9uXG4gKi9cblxuICAgICAgIGNvbnN0IFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUgPSBoYXJkZW4oe1xuICBuYW1lOiAndmF0VXBncmFkZWQnLFxuICB1cGdyYWRlTWVzc2FnZTogTS5zdHJpbmcoKSxcbiAgaW5jYXJuYXRpb25OdW1iZXI6IE0ubnVtYmVyKCksXG59KTtcblxuLyoqXG4gKiBNYWtlcyBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gcmVhc29uIG9mIHByb21pc2VzXG4gKiBhYmFuZG9uZWQgYnkgdXBncmFkZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXBncmFkZU1lc3NhZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luY2FybmF0aW9uTnVtYmVyXG4gKiBAcmV0dXJucyB7VXBncmFkZURpc2Nvbm5lY3Rpb259XG4gKi8kaM2PX29uY2UuVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZShVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAodXBncmFkZU1lc3NhZ2UsIHRvSW5jYXJuYXRpb25OdW1iZXIpID0+XG4gIGhhcmRlbih7XG4gICAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgICB1cGdyYWRlTWVzc2FnZSxcbiAgICBpbmNhcm5hdGlvbk51bWJlcjogdG9JbmNhcm5hdGlvbk51bWJlcixcbiAgfSk7JGjNj19vbmNlLm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHJlYXNvbiBJZiBgcmVhc29uYCBpcyBub3QgZnJvemVuLCBpdCBjYW5ub3QgYmUgYW5cbiAqICAgVXBncmFkZURpc2Nvbm5lY3Rpb24sIHNvIHJldHVybnMgZmFsc2Ugd2l0aG91dCBldmVuIGNoZWNraW5nIGFnYWluc3QgdGhlXG4gKiAgIHNoYXBlLlxuICogQHJldHVybnMge3JlYXNvbiBpcyBVcGdyYWRlRGlzY29ubmVjdGlvbn1cbiAqL1xuICAgICAgIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSByZWFzb24gPT5cbiAgcmVhc29uICE9IG51bGwgJiYgLyogZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEqL1xuICBpc0Zyb3plbihyZWFzb24pICYmXG4gIG1hdGNoZXMocmVhc29uLCBVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTskaM2PX29uY2UuaXNVcGdyYWRlRGlzY29ubmVjdGlvbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSByZWFzb24gaXMgYSAndmF0IHRlcm1pbmF0ZWQnIGVycm9yIGdlbmVyYXRlZCB3aGVuIGFuIG9iamVjdFxuICogaXMgYWJhbmRvbmVkIGJ5IGEgdmF0IGR1cmluZyBhbiB1cGdyYWRlLlxuICpcbiAqIE5vcm1hbGx5IHdlIGRvIG5vdCB3YW50IHRvIHJlbHkgb24gdGhlIGBtZXNzYWdlYCBvZiBhbiBlcnJvciBvYmplY3QsIGJ1dCB0aGlzXG4gKiBpcyBhIHByYWdtYXRpYyBzb2x1dGlvbiB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB2YXQgdXBncmFkZSBlcnJvcnMuIEluIHRoZVxuICogZnV0dXJlIHdlJ2QgcHJlZmVyIGhhdmluZyBhbiBlcnJvciB3aXRoIGEgY2F1c2UgcmVmZXJlbmNpbmcgYSBkaXNjb25uZWN0aW9uXG4gKiBvYmplY3QgbGlrZSBmb3IgcHJvbWlzZSByZWplY3Rpb25zLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOTU4MlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWFzb25cbiAqIEByZXR1cm5zIHtyZWFzb24gaXMgRXJyb3J9XG4gKi9cbiAgICAgICBjb25zdCBpc0FiYW5kb25lZEVycm9yID0gcmVhc29uID0+XG4gIHJlYXNvbiAhPSBudWxsICYmIC8qIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxKi9cbiAgaXNGcm96ZW4ocmVhc29uKSAmJlxuICBtYXRjaGVzKHJlYXNvbiwgTS5lcnJvcigpKSAmJlxuICAvKiBXZSdyZSBub3QgdXNpbmcgYSBjb25zdGFudCBoZXJlIHNpbmNlIHRoaXMgc3BlY2lhbCB2YWx1ZSBpcyBhbHJlYWR5Ki9cbiAgLyogc3ByaW5rbGVkIHRocm91Z2hvdXQgdGhlIFNESyovXG4gIHJlYXNvbi5tZXNzYWdlID09PSAndmF0IHRlcm1pbmF0ZWQnOyRozY9fb25jZS5pc0FiYW5kb25lZEVycm9yKGlzQWJhbmRvbmVkRXJyb3IpO1xuaGFyZGVuKGlzQWJhbmRvbmVkRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSI6WyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIl0sIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzQWJhbmRvbmVkRXJyb3IiOlsiaXNBYmFuZG9uZWRFcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/4UE8GRQAABkUAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0Jhc2VOb3RpZmllciwgSXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzdWJzY3JpYmVMYXRlc3RgIGZyb20gYEBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzYCBpbnN0ZWFkLlxuICpcbiAqIEFkYXB0b3IgZnJvbSBhIG5vdGlmaWVyUCB0byBhbiBhc3luYyBpdGVyYWJsZS5cbiAqIFRoZSBub3RpZmllclAgY2FuIGJlIGFueSBvYmplY3QgdGhhdCBoYXMgYW4gZXZlbnR1YWxseSBpbnZvY2FibGVcbiAqIGBnZXRVcGRhdGVTaW5jZWAgbWV0aG9kIHRoYXQgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIG5vdGlmaWVyXG4gKiBzcGVjLiBUaGlzIGNhbiBiZSBhIG5vdGlmaWVyLCBhIHByb21pc2UgZm9yIGEgbG9jYWwgb3IgcmVtb3RlXG4gKiBub3RpZmllciwgb3IgYSBwcmVzZW5jZSBvZiBhIHJlbW90ZSBub3RpZmllci5cbiAqXG4gKiBJdCBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBub3RpZmllci5qcyBzbyB0aGF0IGEgbm90aWZpZXIgaXRzZWxmIGlzIGFuXG4gKiBhc3luYyBpdGVyYWJsZS5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYWJsZSBpcyBhbiBvYmplY3Qgd2l0aCBhIGBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClgIG1ldGhvZFxuICogdGhhdCByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhdG9yLiBUaGUgYXN5bmMgaXRlcmF0b3Igd2UgcmV0dXJuIGhlcmUgaGFzIG9ubHlcbiAqIGEgYG5leHQoKWAgbWV0aG9kLCB3aXRob3V0IHRoZSBvcHRpb25hbCBgcmV0dXJuYCBhbmQgYHRocm93YCBtZXRob2RzLiBUaGVcbiAqIG9taXR0ZWQgbWV0aG9kcywgaWYgcHJlc2VudCwgd291bGQgYmUgdXNlZCBieSB0aGUgZm9yL2F3YWl0L29mIGxvb3AgdG9cbiAqIGluZm9ybSB0aGUgaXRlcmF0b3Igb2YgZWFybHkgdGVybWluYXRpb24uIEJ1dCB0aGlzIGFkYXB0b3Igd291bGQgbm90IGRvXG4gKiBhbnl0aGluZyB1c2VmdWwgaW4gcmVhY3Rpb24gdG8gdGhpcyBub3RpZmljYXRpb24uXG4gKlxuICogQW4gYXN5bmMgaXRlcmF0b3IncyBgbmV4dCgpYCBtZXRob2QgcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGl0ZXJhdGlvblxuICogcmVzdWx0LiBBbiBpdGVyYXRpb24gcmVzdWx0IGlzIGEgcmVjb3JkIHdpdGggYHZhbHVlYCBhbmQgYGRvbmVgIHByb3BlcnRpZXMuXG4gKlxuICogVGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgb24gdGhlIG5vdGlmaWVyIHByb3RvY29sIGlzIHRvIGhhdmUgYSBsb3NzeVxuICogYWRhcHRvciwgd2hlcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgY2FuIGJlIG1pc3NlZCBpbiBmYXZvciBvZiBtb3JlIHJlY2VudFxuICogcmVzdWx0cyB3aGljaCBhcmUgdGhlcmVmb3JlIGxlc3Mgc3RhbGUuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9kb2N1bWVudGF0aW9uL2Jsb2IvSEVBRC9tYWluL2d1aWRlcy9qcy1wcm9ncmFtbWluZy9ub3RpZmllcnMubWRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyID0gc3Vic2NyaWJlTGF0ZXN0O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaM2PX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuICAgICAgIGNvbnN0IG9ic2VydmVJdGVyYXRvciA9IChhc3luY0l0ZXJhdG9yUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChhY2ssIG9ic2VydmVyRXJyb3IpID0+IHtcbiAgICBjb25zdCByZWN1ciA9ICgpID0+IHtcbiAgICAgIEUud2hlbihcbiAgICAgICAgRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuICAgICAgICAoeyB2YWx1ZSwgZG9uZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCAmJiBpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuICAgICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlICYmXG4gICAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHJlY3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWFzb24gPT4ge1xuICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLmZhaWwgJiYgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuICAgICAgICAgIGFjayh1bmRlZmluZWQpO1xuICAgICAgICB9LFxuICAgICAgKS5jYXRjaChvYnNlcnZlckVycm9yKTtcbiAgICB9O1xuICAgIHJlY3VyKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUaGlzIHJlYWRzIGZyb20gYGFzeW5jSXRlcmFibGVQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0aW9uYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuICAgICAgIGNvbnN0IG9ic2VydmVJdGVyYXRpb24gPSAoYXN5bmNJdGVyYWJsZVAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yUCA9IEUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICByZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpO1xufTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRozY9fb25jZS5vYnNlcnZlSXRlcmF0aW9uKG9ic2VydmVJdGVyYXRpb24pO1xuICAgICAgIGNvbnN0IG9ic2VydmVOb3RpZmllciA9IChub3RpZmllclAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PlxuICBvYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUxhdGVzdChub3RpZmllclApLCBpdGVyYXRpb25PYnNlcnZlcik7JGjNj19vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCPu246wcAAOsHAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vbm90aWZpZXIuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL3RvcGljLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vdG9waWMuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9wdWJsaXNoLWtpdC5qcyI6W1sibWFrZVB1Ymxpc2hLaXQiLCJtYWtlUHVibGlzaEtpdCJdLFsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sWyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLFsiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVFYWNoVG9waWNJIl0sWyJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sWyJTdWJzY3JpYmVyU2hhcGUiLCJTdWJzY3JpYmVyU2hhcGUiXV0sIi4vc3Vic2NyaWJlLmpzIjpbWyJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlRWFjaCJdLFsic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0Il1dLCIuL25vdGlmaWVyLmpzIjpbWyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiXSxbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCJdLFsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdLFsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdXSwiLi9zdWJzY3JpYmVyLmpzIjpbWyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbiJdLFsibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXV0sIi4vdG9waWMuanMiOltbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiLCJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALNJ/07FGwAAxRsAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIixbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaXNoS2l0LCBTdWJzY3JpYmVyLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyID0gc2hhcmFibGVJbnRlcm5hbHNQID0+IHtcbiAgLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLnN1YnNjcmliZUxhdGVzdChzaGFyYWJsZUludGVybmFsc1ApLFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyB1cGRhdGVDb3VudCA9PlxuICAgICAgRShzaGFyYWJsZUludGVybmFsc1ApLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcblxuICAgIC8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG4gICAgZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczogYXN5bmMgKCkgPT4gc2hhcmFibGVJbnRlcm5hbHNQLFxuICAgIC8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZWQgb25seSBieSBgbWFrZUNhc3RpbmdTcGVjRnJvbVJlZmAuICBJbnN0ZWFkIHRoYXQgZnVuY3Rpb24gc2hvdWxkIHVzZVxuICogdGhlIGBTdG9yZWRGYWNldGAgQVBJLlxuICovXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IGhhcmRlbih7IG5vdGlmaWVyIH0pLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+IHwgUmVtb3RlPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIgPSBzdWJzY3JpYmVyID0+IHtcbiAgLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbiAgY29uc3QgYmFzZU5vdGlmaWVyID0gaGFyZGVuKHtcbiAgICBnZXRVcGRhdGVTaW5jZTogKHVwZGF0ZUNvdW50ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAuLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbiAgICAuLi5iYXNlTm90aWZpZXIsXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJLaXQgPSAoLi4uaW5pdGlhbFN0YXRlQXJyKSA9PiB7XG4gIC8qKiBAdHlwZSB7UHVibGlzaEtpdDxUPn0gKi9cbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgY29uc3Qgbm90aWZpZXIgPSBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuICBjb25zdCB1cGRhdGVyID0gRmFyKCd1cGRhdGVyJywge1xuICAgIHVwZGF0ZVN0YXRlOiBzdGF0ZSA9PiBwdWJsaXNoZXIucHVibGlzaChzdGF0ZSksXG4gICAgZmluaXNoOiBjb21wbGV0aW9uID0+IHB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG4gICAgZmFpbDogcmVhc29uID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4gIH0pO1xuXG4gIGFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoIDw9IDEsICd0b28gbWFueSBhcmd1bWVudHMnKTtcbiAgaWYgKGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPT09IDEpIHtcbiAgICB1cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gIH1cblxuICAvKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbiAgLyogaXMgdGlnaHRseSBoZWxkKi9cbiAgcmV0dXJuIGhhcmRlbih7IG5vdGlmaWVyLCB1cGRhdGVyIH0pO1xufTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUgPSBhc3luY0l0ZXJhYmxlUCA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yUCA9IEUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gIC8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbiAgbGV0IG9wdE5leHRQcm9taXNlO1xuICBsZXQgY3VycmVudFVwZGF0ZUNvdW50ID0gMG47XG4gIC8qKiBAdHlwZSB7RVJlZjxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbiAgbGV0IGN1cnJlbnRSZXNwb25zZTtcbiAgbGV0IGZpbmFsID0gZmFsc2U7XG5cbiAgLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbiAgY29uc3QgYmFzZU5vdGlmaWVyID0gRmFyKCdiYXNlTm90aWZpZXInLCB7XG4gICAgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQgPSAtMW4pIHtcbiAgICAgIGlmICh1cGRhdGVDb3VudCA8IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICBpZiAoY3VycmVudFJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZUNvdW50ICE9PSBjdXJyZW50VXBkYXRlQ291bnQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvKiBSZXR1cm4gYSBmaW5hbCByZXNwb25zZSBpZiB3ZSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbiAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICBhc3NlcnQoY3VycmVudFJlc3BvbnNlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdE5leHRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IG5leHRJdGVyUmVzdWx0UCA9IEUoaXRlcmF0b3JQKS5uZXh0KCk7XG4gICAgICAgIG9wdE5leHRQcm9taXNlID0gRS53aGVuKFxuICAgICAgICAgIG5leHRJdGVyUmVzdWx0UCxcbiAgICAgICAgICAoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQoIWZpbmFsKTtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRVcGRhdGVDb3VudCArPSAxbjtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9IGhhcmRlbih7XG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB1cGRhdGVDb3VudDogZG9uZSA/IHVuZGVmaW5lZCA6IGN1cnJlbnRVcGRhdGVDb3VudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3B0TmV4dFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgX3JlYXNvbiA9PiB7XG4gICAgICAgICAgICBmaW5hbCA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50UmVzcG9uc2UgPVxuICAgICAgICAgICAgICAvKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gKi9cbiAgICAgICAgICAgICAgKG5leHRJdGVyUmVzdWx0UCk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHROZXh0UHJvbWlzZTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4gICAgLyogd2FudCB0aGUgc2FtZSBzZW1hbnRpY3MgZm9yIHRoaXMgZXhwb3NlZCBpdGVyYWJsZSBhbmQgdGhlIGJhc2VOb3RpZmllci4qL1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllcixcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGyEXozNCAAAzQgAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUsRmFyLG1ha2VQcm9taXNlS2l0LE0sZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGNhbkJlRHVyYWJsZSxwcmVwYXJlRXhvQ2xhc3NLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSwgRHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHksIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1YmxpY2F0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN1YnNjcmliZXIsIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG5jb25zdCBzaW5rID0gKCkgPT4ge307XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb24gPSByZWFzb24gPT4ge1xuICBjb25zdCByZWplY3Rpb24gPSBoYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG4gIHZvaWQgRS53aGVuKHJlamVjdGlvbiwgc2luaywgc2luayk7XG4gIHJldHVybiByZWplY3Rpb247XG59O1xuY29uc3QgdG9vRmFyUmVqZWN0aW9uID0gbWFrZVF1aWV0UmVqZWN0aW9uKFxuICBoYXJkZW4oRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSksXG4pO1xuXG4gICAgICAgY29uc3QgUHVibGlzaGVySSA9IE0uaW50ZXJmYWNlKCdQdWJsaXNoZXInLCB7XG4gIHB1Ymxpc2g6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZpbmlzaDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbn0pO1xuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBOb3RpZmllciBgZ2V0VXBkYXRlU2luY2VgLiovJGjNj19vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG4gICAgICAgY29uc3QgVXBkYXRlQ291bnRTaGFwZSA9IE0ub3IoTS5iaWdpbnQoKSwgTS5udW1iZXIoKSk7JGjNj19vbmNlLlVwZGF0ZUNvdW50U2hhcGUoVXBkYXRlQ291bnRTaGFwZSk7XG4gICAgICAgY29uc3QgU3Vic2NyaWJlckkgPSBNLmludGVyZmFjZSgnU3Vic2NyaWJlcicsIHtcbiAgc3Vic2NyaWJlQWZ0ZXI6IE0uY2FsbCgpLm9wdGlvbmFsKE0uYmlnaW50KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRVcGRhdGVTaW5jZTogTS5jYWxsKCkub3B0aW9uYWwoVXBkYXRlQ291bnRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG59KTskaM2PX29uY2UuU3Vic2NyaWJlckkoU3Vic2NyaWJlckkpO1xuICAgICAgIGNvbnN0IHB1Ymxpc2hLaXRJS2l0ID0gaGFyZGVuKHtcbiAgcHVibGlzaGVyOiBQdWJsaXNoZXJJLFxuICBzdWJzY3JpYmVyOiBTdWJzY3JpYmVySSxcbn0pOyRozY9fb25jZS5wdWJsaXNoS2l0SUtpdChwdWJsaXNoS2l0SUtpdCk7XG5cbiAgICAgICBjb25zdCBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlID0gTS5pbnRlcmZhY2UoXG4gICdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicsXG4gIHtcbiAgICBmb3JrOiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksIC8qIG9vcHM6IHJlY3Vyc2l2ZSB0eXBlKi9cbiAgICBuZXh0OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLmFueSgpKSxcbiAgfSxcbik7JGjNj19vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUVhY2hUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVFYWNoVG9waWMnLCB7XG4gIHN1YnNjcmliZUFmdGVyOlxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpLFxuICApLFxufSk7JGjNj19vbmNlLkl0ZXJhYmxlRWFjaFRvcGljSShJdGVyYWJsZUVhY2hUb3BpY0kpO1xuXG4gICAgICAgY29uc3QgSXRlcmFibGVMYXRlc3RUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycsIHtcbiAgZ2V0VXBkYXRlU2luY2U6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuZ2V0VXBkYXRlU2luY2UsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gQXJnXG4gKiBAdGVtcGxhdGUgUmV0XG4gKiBAcGFyYW0geyhhcmc6IEFyZykgPT4gUmV0fSBmblxuICogQHJldHVybnMgeyhhcmc6IEFyZykgPT4gUmV0fVxuICovJGjNj19vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnkgPSBmbiA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIGFyZyA9PiB7XG4gICAgLyoqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgY29uc3Qgb2FyZyA9IGFyZztcbiAgICBpZiAoY2FjaGUuaGFzKG9hcmcpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG9hcmcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmbihhcmcpO1xuICAgIGNhY2hlLnNldChvYXJnLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uUmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtVcGRhdGVSZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQgPSByZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgIHB1Ymxpc2hDb3VudCxcbiAgfSA9IHJlY29yZDtcbiAgaWYgKGRvbmUpIHtcbiAgICAvKiBGaW5hbCByZXN1bHRzIGhhdmUgdW5kZWZpbmVkIHVwZGF0ZUNvdW50LiovXG4gICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogdW5kZWZpbmVkIH0pO1xuICB9XG4gIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgdXBkYXRlQ291bnQ6IHB1Ymxpc2hDb3VudCB9KTtcbn07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVB1Ymxpc2hLaXQgPSAoKSA9PiB7XG4gIC8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG4gIGxldCB0YWlsUDtcbiAgLyoqIEB0eXBlIHt1bmRlZmluZWQgfCAoKHZhbHVlOiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+PikgPT4gdm9pZCl9ICovXG4gIGxldCB0YWlsUjtcbiAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcblxuICBsZXQgY3VycmVudFB1Ymxpc2hDb3VudCA9IDBuO1xuICBsZXQgY3VycmVudFAgPSB0YWlsUDtcbiAgY29uc3QgYWR2YW5jZUN1cnJlbnQgPSAoZG9uZSwgdmFsdWUsIHJlamVjdGlvbikgPT4ge1xuICAgIGlmICh0YWlsUiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UHVibGlzaENvdW50ICs9IDFuO1xuICAgIGN1cnJlbnRQID0gdGFpbFA7XG4gICAgY29uc3QgcmVzb2x2ZUN1cnJlbnQgPSB0YWlsUjtcblxuICAgIGlmIChkb25lKSB7XG4gICAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgICAgIHRhaWxSID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIH1cblxuICAgIGlmIChyZWplY3Rpb24pIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KFxuICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgICBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQsXG4gICAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkID0gd2Vha01lbW9pemVVbmFyeShcbiAgICBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkLFxuICApO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG4gIGNvbnN0IHN1YnNjcmliZXIgPSBGYXIoJ1N1YnNjcmliZXInLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IChwdWJsaXNoQ291bnQgPSAtMW4pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCAnYmlnaW50Jyk7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiB0YWlsUDtcbiAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudFA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IHtcbiAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuICAgICAgfVxuICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgIC8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4gICAgICAgICAgLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbiAgICAgICAgICAvKiBzYW1lIGNyYW5rLi4uKi9cbiAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4gICAgICAgICAgLyogZnVydGhlciBvbmVzLiovXG4gICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge1B1Ymxpc2hlcjxUPn0gKi9cbiAgY29uc3QgcHVibGlzaGVyID0gRmFyKCdQdWJsaXNoZXInLCB7XG4gICAgcHVibGlzaDogdmFsdWUgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQoZmFsc2UsIHZhbHVlKTtcbiAgICB9LFxuICAgIGZpbmlzaDogZmluYWxWYWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCBmaW5hbFZhbHVlKTtcbiAgICB9LFxuICAgIGZhaWw6IHJlYXNvbiA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCB1bmRlZmluZWQsIG1ha2VRdWlldFJlamVjdGlvbihyZWFzb24pKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGhhcmRlbih7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9KTtcbn07JGjNj19vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG5cbmNvbnN0IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSA9IGhhcmRlbih7XG4gIHZhbHVlRHVyYWJpbGl0eTogTS5hbnkoKSxcbiAgcHVibGlzaENvdW50OiBNLmFueSgpLFxuICBzdGF0dXM6IE0uYW55KCksXG4gIGhhc1ZhbHVlOiBNLmFueSgpLFxuICB2YWx1ZTogTS5hbnkoKSxcbn0pO1xuXG4vKiBUT0RPOiBNb3ZlIGR1cmFibGUgcHVibGlzaCBraXQgdG8gYSBuZXcgZmlsZT8qL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHkgJiAnbWFuZGF0b3J5J30gW29wdGlvbnMudmFsdWVEdXJhYmlsaXR5XVxuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9XG4gKi9cbmNvbnN0IGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSA9ICdtYW5kYXRvcnknIH0gPSBvcHRpb25zO1xuICBhc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCAnbWFuZGF0b3J5Jyk7XG4gIHJldHVybiB7XG4gICAgLyogY29uZmlndXJhdGlvbiovXG4gICAgdmFsdWVEdXJhYmlsaXR5LFxuXG4gICAgLyogbGlmZWN5Y2xlIHByb2dyZXNzKi9cbiAgICBwdWJsaXNoQ291bnQ6IDBuLFxuICAgIHN0YXR1czogJ2xpdmUnLCAvKiB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJyovXG5cbiAgICAvKiBwZXJzaXN0ZWQgcmVzdWx0IGRhdGEqL1xuICAgIC8qIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBub24tdGVybWluYWwgdmFsdWVzIGZyb20gYHB1Ymxpc2hgLCovXG4gICAgLyogdmFsdWUgYWxzbyBob2xkcyB0aGUgdGVybWluYWwgdmFsdWUgZnJvbSBgZmluaXNoYCBvciBgZmFpbGAuKi9cbiAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgfTtcbn07XG5cbi8qIFdlIG5lZWQgdGhlIFdlYWtNYXAga2V5IGZvciBhIGtpdCB0byBiZSBhIHZyZWYtYmVhcmluZyBvYmplY3QqL1xuLyogaW4gaXRzIGNvaG9ydCwgYW5kIGhhdmUgYXJiaXRyYXJpbHkgY2hvc2VuIHRoZSBwdWJsaXNoZXIgZmFjZXQuKi9cbi8qKiBAdHlwZWRlZiB7UHVibGlzaGVyPCo+fSBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSAqL1xuLyoqXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5fVxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXkgPSBmYWNldHMgPT4gZmFjZXRzLnB1Ymxpc2hlcjtcblxuLyoqXG4gKiBAdHlwZWRlZiBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGFcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPiB8IHVuZGVmaW5lZH0gY3VycmVudFAgVGhlIGN1cnJlbnQtcmVzdWx0IHByb21pc2VcbiAqICAgKHVuZGVmaW5lZCB1bmxlc3MgcmVzb2x2ZWQgd2l0aCB1bnJlY292ZXJhYmxlIGVwaGVtZXJhbCBkYXRhKVxuICogQHByb3BlcnR5IHtQcm9taXNlPCo+fSB0YWlsUCBUaGUgbmV4dC1yZXN1bHQgcHJvbWlzZVxuICogQHByb3BlcnR5IHsoKHZhbHVlOiBhbnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSB0YWlsUiBUaGUgbmV4dC1yZXN1bHQgcmVzb2x2ZXJcbiAqICAgKHVuZGVmaW5lZCB3aGVuIHRoZSBwdWJsaXNoIGtpdCBoYXMgdGVybWluYXRlZClcbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXksIER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT59ICovXG5jb25zdCBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQtcmVzdWx0IHByb21pc2UgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZHVyYWJsZVxuICogcHVibGlzaCBraXQsIHJlY3JlYXRlZCB1bmxlc3Mgd2UgYWxyZWFkeSBoYXZlIG9uZSB3aXRoIHJldGFpbmVkXG4gKiBlcGhlbWVyYWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHBhcmFtIHtQcm9taXNlPCo+fSB0YWlsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAqL1xuY29uc3QgcHJvdmlkZUN1cnJlbnRQID0gKHN0YXRlLCBmYWNldHMsIHRhaWwpID0+IHtcbiAgY29uc3QgZXBoZW1lcmFsS2V5ID0gZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyk7XG4gIGNvbnN0IGZvdW5kRGF0YSA9IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbiAgY29uc3QgY3VycmVudFAgPSBmb3VuZERhdGEgJiYgZm91bmREYXRhLmN1cnJlbnRQO1xuICBpZiAoY3VycmVudFApIHtcbiAgICByZXR1cm4gY3VycmVudFA7XG4gIH1cblxuICBjb25zdCB7IHB1Ymxpc2hDb3VudCwgc3RhdHVzLCBoYXNWYWx1ZSwgdmFsdWUgfSA9IHN0YXRlO1xuICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgYXNzZXJ0KHN0YXR1cyA9PT0gJ2xpdmUnKTtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuICBpZiAoc3RhdHVzID09PSAnbGl2ZScgfHwgc3RhdHVzID09PSAnZmluaXNoZWQnKSB7XG4gICAgY29uc3QgY2VsbCA9IGhhcmRlbih7XG4gICAgICBoZWFkOiB7IHZhbHVlLCBkb25lOiBzdGF0dXMgIT09ICdsaXZlJyB9LFxuICAgICAgcHVibGlzaENvdW50LFxuICAgICAgdGFpbCxcbiAgICB9KTtcbiAgICByZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICByZXR1cm4gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dC1yZXN1bHQgcHJvbWlzZSBhbmQgcmVzb2x2ZXIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW5cbiAqIGR1cmFibGUgcHVibGlzaCBraXQuXG4gKiBUaGVzZSBhcmUgbG9zdCBvbiB1cGdyYWRlIGJ1dCByZWNyZWF0ZWQgb24tZGVtYW5kLCBwcmVzZXJ2aW5nIHRoZVxuICogdmFsdWUgaW4gKGJ1dCBub3QgdGhlIGlkZW50aXR5IG9mKSB0aGUgY3VycmVudCB7IHZhbHVlLCBkb25lIH0gcmVzdWx0XG4gKiB3aGVuIHBvc3NpYmxlLCB3aGljaCBpcyBhbHdheXMgdGhlIGNhc2Ugd2hlbiB0aGF0IHZhbHVlIGlzIHRlcm1pbmFsXG4gKiAoaS5lLiwgZnJvbSBgZmluaXNoYCBvciBgZmFpbGApIG9yIHdoZW4gdGhlIGR1cmFibGUgcHVibGlzaCBraXQgaXNcbiAqIGNvbmZpZ3VyZWQgd2l0aCBgdmFsdWVEdXJhYmlsaXR5OiAnbWFuZGF0b3J5J2AuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGF9XG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEgPSAoc3RhdGUsIGZhY2V0cykgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBpZiAoZm91bmREYXRhKSB7XG4gICAgcmV0dXJuIGZvdW5kRGF0YTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJykge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG4gIC8qIGN1cnJlbnRQIGlzIG5vdCBlcGhlbWVyYWwgd2hlbiByZXN0b3JpbmcgZnJvbSBwZXJzaXN0ZWQgc3RhdGUuKi9cbiAgY29uc3Qgb2JqID0gaGFyZGVuKHsgY3VycmVudFA6IHVuZGVmaW5lZCwgdGFpbFAsIHRhaWxSIH0pO1xuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSwgb2JqKTtcbiAgcmV0dXJuIG9iajtcbn07XG5cbi8qKlxuICogRXh0ZW5kcyB0aGUgc2VxdWVuY2Ugb2YgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0ge3tzdGF0ZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSwgZmFjZXRzOiBQdWJsaXNoS2l0PCo+fX0gY29udGV4dFxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGVbJ3N0YXR1cyddfSBbdGFyZ2V0U3RhdHVzXVxuICovXG5jb25zdCBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQgPSAoY29udGV4dCwgdmFsdWUsIHRhcmdldFN0YXR1cyA9ICdsaXZlJykgPT4ge1xuICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHsgdmFsdWVEdXJhYmlsaXR5LCBzdGF0dXMgfSA9IHN0YXRlO1xuICBpZiAoc3RhdHVzICE9PSAnbGl2ZScpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiAgfVxuICBjb25zdCBkb25lID0gdGFyZ2V0U3RhdHVzICE9PSAnbGl2ZSc7XG4gIGlmIChkb25lIHx8IHZhbHVlRHVyYWJpbGl0eSA9PT0gJ21hbmRhdG9yeScpIHtcbiAgICBjYW5CZUR1cmFibGUodmFsdWUpIHx8IEZhaWxgQ2Fubm90IGFjY2VwdCBub24tZHVyYWJsZSB2YWx1ZTogJHt2YWx1ZX1gO1xuICB9XG4gIGNvbnN0IHsgdGFpbFA6IG9sZFRhaWxQLCB0YWlsUjogcmVzb2x2ZU9sZFRhaWwgfSA9XG4gICAgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShzdGF0ZSwgZmFjZXRzKTtcbiAgYXNzZXJ0LnR5cGVvZihyZXNvbHZlT2xkVGFpbCwgJ2Z1bmN0aW9uJyk7XG5cbiAgY29uc3QgcHVibGlzaENvdW50ID0gc3RhdGUucHVibGlzaENvdW50ICsgMW47XG4gIHN0YXRlLnB1Ymxpc2hDb3VudCA9IHB1Ymxpc2hDb3VudDtcblxuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKGRvbmUpIHtcbiAgICBzdGF0ZS5zdGF0dXMgPSB0YXJnZXRTdGF0dXM7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gICAgdGFpbFIgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH1cblxuICBsZXQgY3VycmVudFA7XG4gIGlmICh0YXJnZXRTdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgc3RhdGUuaGFzVmFsdWUgPSB0cnVlO1xuICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgY29uc3QgcmVqZWN0aW9uID0gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiAgICByZXNvbHZlT2xkVGFpbChyZWplY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIC8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuICAgIC8qIGlmIGNvbmZpZ3VyZWQgYXMgJ21hbmRhdG9yeScgb3IgJ29wcG9ydHVuaXN0aWMnLiovXG4gICAgaWYgKGRvbmUgfHwgKHZhbHVlRHVyYWJpbGl0eSAhPT0gJ2lnbm9yZWQnICYmIGNhbkJlRHVyYWJsZSh2YWx1ZSkpKSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgc3RhdGUudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAvKiBSZXRhaW4gYW55IHByb21pc2Ugd2l0aCBub24tZHVyYWJsZSByZXNvbHV0aW9uLiovXG4gICAgICBjdXJyZW50UCA9IG9sZFRhaWxQO1xuICAgIH1cblxuICAgIHJlc29sdmVPbGRUYWlsKFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgICAgICBwdWJsaXNoQ291bnQsXG4gICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG4gICAgZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyksXG4gICAgaGFyZGVuKHsgY3VycmVudFAsIHRhaWxQLCB0YWlsUiB9KSxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHs8VD4ob3B0aW9ucz86IFBhcmFtZXRlcnM8dHlwZW9mIGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlPlswXSkgPT4gUHVibGlzaEtpdDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT4ge1xuICAvKiBUT0RPOiBPbmNlIHdlIHVuaWZ5IHdpdGggbWFrZVB1Ymxpc2hLaXQsIHdlIHdpbGwgdXNlIGEgWm9uZS1jb21wYXRpYmxlIHdlYWsqL1xuICAvKiBtYXAgZm9yIG1lbW9pemF0aW9uLiovXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbiAgcmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIHB1Ymxpc2hLaXRJS2l0LFxuICAgIGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxuICAgIHtcbiAgICAgIC8qIFRoZSBwdWJsaXNoZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbiAgICAgIC8qIGFjY2VwdHMgbmV3IHZhbHVlcy4qL1xuICAgICAgcHVibGlzaGVyOiB7XG4gICAgICAgIHB1Ymxpc2godmFsdWUpIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBmaW5pc2goZmluYWxWYWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCBmaW5hbFZhbHVlLCAnZmluaXNoZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFpbChyZWFzb24pIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgcmVhc29uLCAnZmFpbGVkJyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKiBUaGUgc3Vic2NyaWJlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuICAgICAgLyogcHJvcGFnYXRlcyB2YWx1ZXMuKi9cbiAgICAgIHN1YnNjcmliZXI6IHtcbiAgICAgICAgc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50ID0gLTFuKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50IH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IGN1cnJlbnRQLCB0YWlsUCB9ID0gcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgZmFjZXRzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQIHx8IHByb3ZpZGVDdXJyZW50UChzdGF0ZSwgZmFjZXRzLCB0YWlsUCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmFjZXRzOiB7IHN1YnNjcmliZXIgfSxcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZUNvdW50ID0gQmlnSW50KHVwZGF0ZUNvdW50KTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgICAgICAvKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuICAgICAgICAgICAgICAvKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuICAgICAgICAgICAgICAvKiBzYW1lIGNyYW5rLi4uKi9cbiAgICAgICAgICAgICAgLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuICAgICAgICAgICAgICAvKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbiAgICAgICAgICAgICAgLyogZnVydGhlciBvbmVzLiovXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSxcbiAgICB9LFxuICApO1xufTskaM2PX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuICAgICAgIGNvbnN0IFN1YnNjcmliZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjNj19vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGlzaGVySSI6WyJQdWJsaXNoZXJJIl0sIlVwZGF0ZUNvdW50U2hhcGUiOlsiVXBkYXRlQ291bnRTaGFwZSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSwiSXRlcmFibGVFYWNoVG9waWNJIjpbIkl0ZXJhYmxlRWFjaFRvcGljSSJdLCJJdGVyYWJsZUxhdGVzdFRvcGljSSI6WyJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALEhEN6oMAACqDAAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAZW5kby9mYXIiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtCYXNlTm90aWZpZXIsIE5vdGlmaWVyfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge1N0b3JlZEZhY2V0LCBTdG9yYWdlTm9kZSwgVW5zZXJpYWxpemVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlQ2FwfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+ICYgT21pdDxTdG9yZWRGYWNldCwgJ2dldFN0b3JlS2V5Jz59IFN0b3JlZE5vdGlmaWVyXG4gKi9cblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZE5vdGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlQ2FwfSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWROb3RpZmllcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWROb3RpZmllciA9IChub3RpZmllciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciB9KTtcblxuICBjb25zdCBtYXJzaGFsbFRvU3RvcmFnZSA9IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpO1xuXG4gIG9ic2VydmVOb3RpZmllcihub3RpZmllciwge1xuICAgIHVwZGF0ZVN0YXRlKHZhbHVlKSB7XG4gICAgICBtYXJzaGFsbFRvU3RvcmFnZSh2YWx1ZSkuY2F0Y2gocmVhc29uID0+XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScsIHJlYXNvbiksXG4gICAgICApO1xuICAgIH0sXG4gICAgZmFpbChyZWFzb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byBpdGVyYXRlJywgcmVhc29uKTtcbiAgICB9LFxuICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGhhbHRlZCBpdGVyYXRpb24nLCByZWFzb24pO1xuICB9KTtcblxuICAvKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBzdG9yZWROb3RpZmllciA9IEZhcignU3RvcmVkTm90aWZpZXInLCB7XG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgICBnZXRQYXRoOiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gIH0pO1xuICByZXR1cm4gc3RvcmVkTm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeuZOXiQmAAAkJgAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsbWFrZVN1YnNjcmlwdGlvbktpdCxzdWJzY3JpYmVFYWNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIixbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLFskaM2PX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7SXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1YmxpY2F0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN0b3JlZFB1Ymxpc2hLaXQsIFN0b3JlZFN1YnNjcmlwdGlvbiwgU3RvcmVkU3Vic2NyaWJlciwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZSwgVW5zZXJpYWxpemVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZUNhcH0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKi9cblxuLyoqXG4gKiBOQjogZG9lcyBub3QgeWV0IHN1cnZpdmUgdXBncmFkZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzY4OTNcbiAqXG4gKiBAYWxwaGFcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG4gICAgICAgY29uc3QgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkID0gYXN5bmMgKHN1YnNjcmliZXIsIGNvbnN1bWVWYWx1ZSkgPT4ge1xuICAvKiBXZSBvcGVuLWNvZGUgdGhlIGZvci1hd2FpdC1vZiBpbXBsZW1lbnRhdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGF0IHN5bnRheCovXG4gIC8qIGRpcmVjdGx5IGJlY2F1c2Ugd2Ugd2FudCB0byBydW4gdGhlIGNvbnN1bWVyIG9uIHRoZSBkb25lIHZhbHVlIGFzIHdlbGwuKi9cbiAgY29uc3QgaXRlcmF0b3IgPSBzdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBhd2FpdCBudWxsO1xuICB3aGlsZSAoIWZpbmlzaGVkKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgIGF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG4gICAgZmluaXNoZWQgPSAhIWRvbmU7XG4gIH1cbn07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlQ2FwfSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaWJlcjxUPn1cbiAqLyRozY9fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkU3Vic2NyaWJlciA9IChzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIgfSk7XG5cbiAgY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2UgPSBtYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKTtcblxuICAvKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbiAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsIG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaChlcnIgPT4ge1xuICAgIC8qIFRPRE86IEhvdyBzaG91bGQgd2UgaGFuZGxlIGFuZC9vciBzdXJmYWNlIHRoaXMgZmFpbHVyZT8qL1xuICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbiAgICBjb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJywgZXJyKTtcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuICBjb25zdCBzdG9yZXN1YiA9IEZhcignU3RvcmVkU3Vic2NyaWJlcicsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogcHVibGlzaENvdW50ID0+IHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICB9KTtcbiAgcmV0dXJuIHN0b3Jlc3ViO1xufTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsfSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRTdWJzY3JpcHRpb24gPSAoXG4gIHN1YnNjcmlwdGlvbixcbiAgc3RvcmFnZU5vZGUsXG4gIG1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbCh1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgIG1hcnNoYWxTYXZlRXJyb3I6ICgpID0+IHt9LFxuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxuICB9KSxcbikgPT4ge1xuICAvKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiBBYm9ydCB0aGUgaXRlcmF0aW9uIG9uIHRoZSBuZXh0IG9ic2VydmF0aW9uIGlmIHRoZSBwdWJsaXNoZXIgZXZlciBmYWlscy4qL1xuICBsZXQgcHVibGlzaEZhaWxlZCA9IGZhbHNlO1xuICBsZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuICBjb25zdCBmYWlsID0gZXJyID0+IHtcbiAgICBwdWJsaXNoRmFpbGVkID0gdHJ1ZTtcbiAgICBwdWJsaXNoRXhjZXB0aW9uID0gZXJyO1xuICB9O1xuXG4gIC8qIE11c3QgKm5vdCogYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgc29tZXRpbWVzIG11c3QgdGhyb3cgdG8gYWJvcnQqL1xuICAvKiB0aGUgaXRlcmF0aW9uLiovXG4gIGNvbnN0IHB1Ymxpc2hWYWx1ZSA9IG9iaiA9PiB7XG4gICAgYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbiAgICBpZiAocHVibGlzaEZhaWxlZCkge1xuICAgICAgLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG4gICAgICB0aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuICAgIH1cblxuICAgIC8qIFB1Ymxpc2ggdGhlIHZhbHVlLCBjYXB0dXJpbmcgYW55IGVycm9yLiovXG4gICAgRShtYXJzaGFsbGVyKVxuICAgICAgLnRvQ2FwRGF0YShvYmopXG4gICAgICAudGhlbihzZXJpYWxpemVkID0+IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xuICAgICAgICByZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZhaWwpO1xuICB9O1xuXG4gIGlmIChzdG9yYWdlTm9kZSkge1xuICAgIC8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuICAgIG9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLCB7XG4gICAgICB1cGRhdGVTdGF0ZTogcHVibGlzaFZhbHVlLFxuICAgICAgZmluaXNoOiBwdWJsaXNoVmFsdWUsXG4gICAgfSkuY2F0Y2goZmFpbCk7XG4gIH1cblxuICAvKiogQHR5cGUge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gKi9cbiAgY29uc3Qgc3RvcmVzdWIgPSBGYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicsIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGdldFN0b3JlS2V5IHR5cGUgZG9lcyBub3QgaGF2ZSBgc3Vic2NyaXB0aW9uYCovXG4gICAgZ2V0U3RvcmVLZXk6IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc3RvcmFnZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IHN1YnNjcmlwdGlvbiB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3JlS2V5ID0gYXdhaXQgRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyAuLi5zdG9yZUtleSwgc3Vic2NyaXB0aW9uIH0pO1xuICAgIH0sXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gICAgZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6ICgpID0+XG4gICAgICBzdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG4gICAgc3Vic2NyaWJlQWZ0ZXI6IHB1Ymxpc2hDb3VudCA9PiBzdWJzY3JpcHRpb24uc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbiAgfSk7XG4gIHJldHVybiBzdG9yZXN1Yjtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFB1Ymxpc2hLaXRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoZXJLaXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaXNoZXJcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+IHwgbnVsbH0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoaWxkUGF0aF1cbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoZXJLaXQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RvcmVkUHVibGlzaGVyS2l0ID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyLCBjaGlsZFBhdGgpID0+IHtcbiAgY29uc3QgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH0gPSBtYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbiAgaWYgKHN0b3JhZ2VOb2RlICYmIGNoaWxkUGF0aCkge1xuICAgIHN0b3JhZ2VOb2RlID0gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuICB9XG5cbiAgLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbiAgY29uc3Qgc3Vic2NyaWJlciA9IG1ha2VTdG9yZWRTdWJzY3JpcHRpb24oXG4gICAgc3Vic2NyaXB0aW9uLFxuICAgIHN0b3JhZ2VOb2RlLFxuICAgIG1hcnNoYWxsZXIsXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoZXI6IHB1YmxpY2F0aW9uLFxuICAgIHN1YnNjcmliZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hLaXQ8VD59XG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkUHVibGlzaEtpdCA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcixcbiAgICAvKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG4gICAgc3Vic2NyaWJlcjogbWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpLFxuICB9O1xufTskaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiXSwibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABkDr188ikAAPIpAAAoAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiXSwiZXhwb3J0cyI6WyJzdWJzY3JpYmUiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxGYWlsLGFubm90YXRlRXJyb3IsRSxGYXIsaXNQcmltaXRpdmUsaXNVcGdyYWRlRGlzY29ubmVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qc1wiLCBbW1wiaXNVcGdyYWRlRGlzY29ubmVjdGlvblwiLFskaM2PX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3RvcmVkUHVibGlzaEtpdCwgU3RvcmVkU3Vic2NyaXB0aW9uLCBTdG9yZWRTdWJzY3JpYmVyLCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24sIFVwZGF0ZVJlY29yZCwgRWFjaFRvcGljLCBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcn0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCBzaW5rID0gKCkgPT4ge307XG5cbi8qKlxuICogQ2hlY2sgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBmb3IgcmVqZWN0aW9uIGJ5IHZhdCB1cGdyYWRlLFxuICogYW5kIHJlZmV0Y2ggdXBvbiBlbmNvdW50ZXJpbmcgdGhhdCBjb25kaXRpb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gRVJlZjxUPn0gZ2V0dGVyXG4gKiBAcGFyYW0ge0VSZWY8VD5bXX0gW3NlZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAqL1xuY29uc3QgcmVjb25uZWN0QXNOZWVkZWQgPSBhc3luYyAoZ2V0dGVyLCBzZWVkID0gW10pID0+IHtcbiAgbGV0IGRpc2Nvbm5lY3Rpb247XG4gIGxldCBsYXN0VmVyc2lvbiA9IC1JbmZpbml0eTtcbiAgLyogRW5kIHN5bmNocm9ub3VzIHByZWx1ZGUuKi9cbiAgYXdhaXQgbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IDsgaSArPSAxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdFAgPSBpIDwgc2VlZC5sZW5ndGggPyBzZWVkW2ldIDogZ2V0dGVyKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXN1bHRQO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGVycikpIHtcbiAgICAgICAgaWYgKCFkaXNjb25uZWN0aW9uKSB7XG4gICAgICAgICAgZGlzY29ubmVjdGlvbiA9IGVycjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGluY2FybmF0aW9uTnVtYmVyOiB2ZXJzaW9uIH0gPSBlcnI7XG4gICAgICAgIGlmICh2ZXJzaW9uID4gbGFzdFZlcnNpb24pIHtcbiAgICAgICAgICAvKiBXZSBkb24ndCBleHBlY3QgYW5vdGhlciB1cGdyYWRlIGluIGJldHdlZW4gcmVjZWl2aW5nKi9cbiAgICAgICAgICAvKiBhIGRpc2Nvbm5lY3Rpb24gYW5kIHJlLXJlcXVlc3RpbmcgYW4gdXBkYXRlLCBidXQgbXVzdCovXG4gICAgICAgICAgLyogbmV2ZXJ0aGVsZXNzIGJlIHByZXBhcmVkIGZvciB0aGF0LiovXG4gICAgICAgICAgbGFzdFZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBpZiBgZXJyYCBpcyBhbiAoRXJyb3IpIG9iamVjdCwgd2UgY2FuIHRyeSB0byBhc3NvY2lhdGUgaXQgd2l0aCovXG4gICAgICAvKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzY29ubmVjdGlvbiB0aGF0IHByb21wdGVkIHRoZSByZXF1ZXN0Ki9cbiAgICAgIC8qIGZvciB3aGljaCBpdCBpcyBhIHJlc3VsdC4qL1xuICAgICAgaWYgKCFpc1ByaW1pdGl2ZShlcnIpICYmIGRpc2Nvbm5lY3Rpb24gJiYgZGlzY29ubmVjdGlvbiAhPT0gZXJyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYW5ub3RhdGVFcnJvcihcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgQXR0ZW1wdGluZyB0byByZWNvdmVyIGZyb20gZGlzY29ubmVjdGlvbjogJHtkaXNjb25uZWN0aW9ufWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgIC8qIG5vb3AqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5lYXIgaXRlcmFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHBvdGVudGlhbGx5IGZhciBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4+fSBpdFBcbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZSA9IGl0UCA9PlxuICBGYXIoJ0FzeW5jSXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgaXQgPSBFKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBzZWxmID0gRmFyKCdBc3luY0l0ZXJhYmxlSXRlcmF0b3InLCB7XG4gICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgICAgIG5leHQ6IGFzeW5jICgpID0+IEUoaXQpLm5leHQoKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uUmVjb3JkIGNoYWluIGFzIHRoZXlcbiAqIGFwcGVhci4gIFRoaXMgaXRlcmF0aW9uIG11c3QgZHJvcCBwYXJ0cyBvZiBwdWJsaWNhdGlvbiByZWNvcmRzIHRoYXQgYXJlIG5vXG4gKiBsb25nZXIgbmVlZGVkIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IG5leHRDZWxsUFxuICogICBQdWJsaWNhdGlvblJlY29yZCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGZpcnN0IGl0ZXJhdGlvbiByZXN1bHRcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqLyRozY9fb25jZS5zdWJzY3JpYmUoc3Vic2NyaWJlKTtcbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3IgPSAodG9waWMsIG5leHRDZWxsUCkgPT4ge1xuICAvKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4gIC8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0VhY2hJdGVyYXRvcicsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaGVhZDogcmVzdWx0UCxcbiAgICAgICAgcHVibGlzaENvdW50OiBwdWJsaXNoQ291bnRQLFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0gPSBFLmdldChuZXh0Q2VsbFApO1xuXG4gICAgICAvKiBJZiB0YWlsUCBpcyBicm9rZW4gYnkgdXBncmFkZSwgd2Ugd2lsbCBuZWVkIHRvIHJlLXJlcXVlc3QgaXQqL1xuICAgICAgLyogZGlyZWN0bHkgZnJvbSBgdG9waWNgLiovXG4gICAgICBjb25zdCBnZXRTdWNjZXNzb3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1Ymxpc2hDb3VudCA9IGF3YWl0IHB1Ymxpc2hDb3VudFA7XG4gICAgICAgIGFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCAnYmlnaW50Jyk7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NvciA9IGF3YWl0IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG4gICAgICAgIGNvbnN0IG5ld1B1Ymxpc2hDb3VudCA9IHN1Y2Nlc3Nvci5wdWJsaXNoQ291bnQ7XG4gICAgICAgIGlmIChuZXdQdWJsaXNoQ291bnQgIT09IHB1Ymxpc2hDb3VudCArIDFuKSB7XG4gICAgICAgICAgRmFpbGBlYWNoSXRlcmF0b3IgYnJva2VuIGJ5IGdhcCBmcm9tIHB1Ymxpc2hDb3VudCAke3B1Ymxpc2hDb3VudH0gdG8gJHtuZXdQdWJsaXNoQ291bnR9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2Vzc29yO1xuICAgICAgfTtcblxuICAgICAgLyogUmVwbGFjZSBuZXh0Q2VsbFAgb24gZXZlcnkgY2FsbCB0byBuZXh0KCkgc28gdGhpbmdzIHdvcmsgZXZlbiovXG4gICAgICAvKiB3aXRoIGFuIGVhZ2VyIGNvbnN1bWVyIHRoYXQgZG9lc24ndCB3YWl0IGZvciByZXN1bHRzIHRvIHNldHRsZS4qL1xuICAgICAgbmV4dENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoZ2V0U3VjY2Vzc29yLCBbdGFpbFBdKTtcblxuICAgICAgLyogQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5ncyBoZXJlIGlmIHRoZSBwcmV2aW91cyBjZWxsIHdhcyByZWplY3RlZCBvciovXG4gICAgICAvKiB0aGVyZSBpcyBubyBmdXJ0aGVyIHJlcXVlc3Qgb2YgdGhpcyBpdGVyYXRvci4qL1xuICAgICAgLyogYHRhaWxQYCBpcyBoYW5kbGVkIGluc2lkZSBgcmVjb25uZWN0QXNOZWVkZWRgIGFuZCBgcmVzdWx0UGAgaXMgdGhlIGNhbGxlcidzKi9cbiAgICAgIC8qIGNvbmNlcm4sIGxlYXZpbmcgb25seSBgcHVibGlzaENvdW50UGAgYW5kIHRoZSBuZXcgYG5leHRDZWxsUGAuKi9cbiAgICAgIHZvaWQgRS53aGVuKHB1Ymxpc2hDb3VudFAsIHNpbmssIHNpbmspO1xuICAgICAgdm9pZCBFLndoZW4obmV4dENlbGxQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHJldHVybiByZXN1bHRQO1xuICAgIH0sXG4gICAgZm9yazogKCkgPT4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgbmV4dENlbGxQKSxcbiAgfSk7XG4gIHJldHVybiBzZWxmO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJwcmVmaXggbG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwicHJlZml4IGxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgZXZlcnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlXG4gKiB5b3UgYXNrIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBmb3IgYW4gaXRlcmF0b3IuIEJ1dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3JcbiAqIHdpbGwgZW51bWVyYXRlIGVhY2ggdGhpbmcgcHVibGlzaGVkIGZyb20gdGhhdCBpdGVyYXRvcidzIHN0YXJ0aW5nIHBvaW50XG4gKiB1cCB0byBhIGRpc2Nvbm5lY3Rpb24gcmVzdWx0IGluZGljYXRpbmcgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXJcbiAqICh3aGljaCBicmVha3MgdGhlIGdhcC1mcmVlIGd1YXJhbnRlZSBhbmQgdGhlcmVmb3JlIHRlcm1pbmF0ZXMgYW55IGFjdGl2ZVxuICogaXRlcmF0b3Igd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBuZXcgaXRlcmF0b3JzKS5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZUVhY2ggPSB0b3BpYyA9PiB7XG4gIGNvbnN0IGl0ZXJhYmxlID0gRmFyKCdFYWNoSXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgZmlyc3RDZWxsUCA9IHJlY29ubmVjdEFzTmVlZGVkKCgpID0+IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKCkpO1xuICAgICAgcmV0dXJuIG1ha2VFYWNoSXRlcmF0b3IodG9waWMsIGZpcnN0Q2VsbFApO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtiaWdpbnR9IFtsb2NhbFVwZGF0ZUNvdW50XVxuICogQHBhcmFtIHtJdGVyYXRvclJldHVyblJlc3VsdDxUPn0gW3Rlcm1pbmFsUmVzdWx0XVxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yID0gKHRvcGljLCBsb2NhbFVwZGF0ZUNvdW50LCB0ZXJtaW5hbFJlc3VsdCkgPT4ge1xuICBsZXQgbXV0ZXggPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKipcbiAqIFJlcXVlc3QgdGhlIG5leHQgdXBkYXRlIHJlY29yZCBmcm9tIHRoZSB0b3BpYywgdXBkYXRpbmcgb3VyIGxvY2FsIHN0YXRlLFxuICogYW5kIGNvbnZlcnQgaXQgdG8gYW4gaXRlcmF0b3IgcmVzdWx0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFQ+Pn1cbiAqL1xuICBjb25zdCBtYXliZVJlcXVlc3ROZXh0UmVzdWx0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICh0ZXJtaW5hbFJlc3VsdCkge1xuICAgICAgLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCByZXN1bHQqL1xuICAgICAgLyogd2l0aG91dCBmdXJ0aGVyIHJlcXVlc3RzLiovXG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuXG4gICAgLyogU2VuZCB0aGUgbmV4dCByZXF1ZXN0IG5vdywgc2tpcHBpbmcgcGFzdCBpbnRlcm1lZGlhdGUgdXBkYXRlcyovXG4gICAgLyogYW5kIHVwZ3JhZGUgZGlzY29ubmVjdGlvbnMuKi9cbiAgICBjb25zdCB7IHZhbHVlLCB1cGRhdGVDb3VudCB9ID0gYXdhaXQgcmVjb25uZWN0QXNOZWVkZWQoKCkgPT5cbiAgICAgIEUodG9waWMpLmdldFVwZGF0ZVNpbmNlKGxvY2FsVXBkYXRlQ291bnQpLFxuICAgICk7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlcXVlc3QgaXMgZm9yIGEgZnJlc2hlciB2YWx1ZS4qL1xuICAgIGxvY2FsVXBkYXRlQ291bnQgPSB1cGRhdGVDb3VudDtcblxuICAgIC8qIE1ha2UgYW4gSXRlcmF0b3JSZXN1bHQuKi9cbiAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVybWluYWxSZXN1bHQgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCBzZWxmID0gRmFyKCdMYXRlc3RJdGVyYXRvcicsIHtcbiAgICBmb3JrOiAoKSA9PiBjbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljLCBsb2NhbFVwZGF0ZUNvdW50LCB0ZXJtaW5hbFJlc3VsdCksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICBuZXh0OiBhc3luYyAoKSA9PiB7XG4gICAgICAvKiBJbiB0aGlzIGFkYXB0b3IsIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkIGFuZCByZXR1cm5zIGFuIHVucmVzb2x2ZWQqL1xuICAgICAgLyogcHJvbWlzZSwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIGFsc28gcmV0dXJuIHVucmVzb2x2ZWQgcHJvbWlzZXMqL1xuICAgICAgLyogYnV0IGVhY2ggY2FsbCB3aWxsIG5vdCB0cmlnZ2VyIGFub3RoZXIgYHRvcGljYCByZXF1ZXN0IHVudGlsIHRoZSBwcmlvciovXG4gICAgICAvKiBvbmUgaGFzIHNldHRsZWQuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFRoaXMgbGluZWFyIHF1ZXVlaW5nIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUqL1xuICAgICAgLyogYXN5bmMgaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbiAgICAgIC8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlKi9cbiAgICAgIC8qIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzKi9cbiAgICAgIC8qIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgKi9cbiAgICAgIC8qIGFnYWluLiovXG4gICAgICAvKiovXG4gICAgICAvKiBTZWUqL1xuICAgICAgLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbiAgICAgIC8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cblxuICAgICAgaWYgKHRlcm1pbmFsUmVzdWx0KSB7XG4gICAgICAgIC8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QqL1xuICAgICAgICAvKiByZXN1bHQuKi9cbiAgICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvKiBCRUdJTiBDUklUSUNBTCBTRUNUSU9OIC0gc3luY2hyb25vdXNseSBlbnF1ZXVlIGFuZCByZWFzc2lnbiBgbXV0ZXhgKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFVzZSBgbXV0ZXhgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgbm8gbW9yZSB0aGFuIGEgc2luZ2xlIHJlcXVlc3QgaW4qL1xuICAgICAgLyogZmxpZ2h0LiovXG4gICAgICBjb25zdCBuZXh0UmVzdWx0ID0gbXV0ZXgudGhlbihtYXliZVJlcXVlc3ROZXh0UmVzdWx0KTtcbiAgICAgIG11dGV4ID0gbmV4dFJlc3VsdC50aGVuKHNpbmssIHNpbmspO1xuICAgICAgLyogRU5EIENSSVRJQ0FMIFNFQ1RJT04qL1xuXG4gICAgICByZXR1cm4gbmV4dFJlc3VsdDtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3IgPSB0b3BpYyA9PiBjbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljKTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGFueSBwdWJsaXNoZWQgc3RhdGUgaWYgYSBtb3JlXG4gKiByZWNlbnQgcHVibGlzaGVkIHN0YXRlIGNhbiBiZSByZXBvcnRlZCBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyLFxuICogaXQgd2lsbCBiZSByZS1yZXF1ZXN0ZWQuIEFsbCBvdGhlciB0ZXJtaW5hbCB2YWx1ZXMgd2lsbCBiZSBsb3NzbGVzc2x5XG4gKiBwcm9wYWdhdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlTGF0ZXN0ID0gdG9waWMgPT4ge1xuICBjb25zdCBpdGVyYWJsZSA9IEZhcignTGF0ZXN0SXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gbWFrZUxhdGVzdEl0ZXJhdG9yKHRvcGljKSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFeqBJEpDQAAKQ0AACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3RvcGljLmpzIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3RvcGljLmpzXCIsIFtbXCJtYWtlUGlubmVkSGlzdG9yeVRvcGljXCIsWyRozY9fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VhY2hUb3BpYywgSXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFN1YnNjcmlwdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdG9yZWRQdWJsaXNoS2l0LCBTdG9yZWRTdWJzY3JpcHRpb24sIFN0b3JlZFN1YnNjcmliZXIsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgVXBkYXRlUmVjb3JkfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge1N1YnNjcmlwdGlvbjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbiA9IHRvcGljID0+IHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gRmFyKCdTdWJzY3JpcHRpb24nLCB7XG4gICAgLi4uc3Vic2NyaWJlRWFjaCh0b3BpYyksXG4gICAgc3Vic2NyaWJlQWZ0ZXI6IGFzeW5jIHB1Ymxpc2hDb3VudCA9PiBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuXG4gICAgLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICovXG4gICAgZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6IGFzeW5jICgpID0+IHRvcGljLFxuXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IGhhcmRlbih7IHN1YnNjcmlwdGlvbiB9KSxcbiAgfSk7XG4gIHJldHVybiBzdWJzY3JpcHRpb247XG59OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uKG1ha2VTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb24pO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUHJvZHVjZXJzIHNob3VsZCB1c2VcbiAqIGBgYGpzXG4gKiBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcbiAqIGNvbnN0IHRvcGljID0gbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbiAqIGBgYFxuICogaW5zdGVhZCwgd2hpY2ggbWFrZXMgaXQgY2xlYXJlciB0aGF0IGFsbCB0aGUgc3Vic2NyaWJlcidzIGhpc3RvcnkgaXNcbiAqIHJldGFpbmVkLCBwcmV2ZW50aW5nIEdDLiAgUG90ZW50aWFsbHkgcmVtb3RlIGNvbnN1bWVycyB1c2VcbiAqIGBgYGpzXG4gKiBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHN1YnNjcmliZUVhY2godG9waWMpKSB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBNYWtlcyBhIGB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfWAgZm9yIGRvaW5nIGxvc3NsZXNzIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1Yi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvblJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbktpdCA9ICgpID0+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4gIC8qIGxvc3NsZXNzIGZyb20gaW5pdGlhbGlzYXRpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgZm9ybWVyJ3MgaGlzdG9yeS4qL1xuXG4gIGNvbnN0IHBpbm5lZEhpc3RvcnlUb3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG1ha2VTdWJzY3JpcHRpb24ocGlubmVkSGlzdG9yeVRvcGljKTtcblxuICAvKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuICBjb25zdCBwdWJsaWNhdGlvbiA9IEZhcigncHVibGljYXRpb24nLCB7XG4gICAgdXBkYXRlU3RhdGU6IG5vbkZpbmFsVmFsdWUgPT4gcHVibGlzaGVyLnB1Ymxpc2gobm9uRmluYWxWYWx1ZSksXG4gICAgZmluaXNoOiBjb21wbGV0aW9uID0+IHB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG4gICAgZmFpbDogcmVhc29uID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH0pO1xufTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAd+ZKRpUGAACVBgAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFYWNoVG9waWMsIExhdGVzdFRvcGljfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgQSBwaW5uZWQtaGlzdG9yeSB0b3BpYyBwcmVzZXJ2ZXMgYWxsIG9mIGl0cyBwdWJsaXNoZWQgdmFsdWVzIGluXG4gKiBtZW1vcnkuICBVc2UgYSBwcmVmaXgtbG9zc3kgbWFrZVB1Ymxpc2hLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn0gdG9waWMgbmVlZHMgdG8gYmUgbmVhciBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgc3Vic2NyaXB0aW9uIHRpbWluZ3MuICBUT0RPOiBkcm9wIGBMYXRlc3RUb3BpYzxUPmAgcmVxdWlyZW1lbnRcbiAqIEByZXR1cm5zIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSB0b3BpYyA9PiB7XG4gIC8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuXG4gIC8qIFdlIG5lZWQgdG8gdGFrZSBhbiBpbW1lZGlhdGUgc25hcHNob3Qgb2YgdGhlIHRvcGljJ3MgY3VycmVudCBzdGF0ZS4qL1xuICBjb25zdCBwaW5uZWRQdWJMaXN0ID0gdG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxuICByZXR1cm4gRmFyKCdQaW5uZWRIaXN0b3J5VG9waWMnLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IGFzeW5jIChwdWJsaXNoQ291bnQgPSAtMW4pID0+IHtcbiAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IC0xbikge1xuICAgICAgICByZXR1cm4gcGlubmVkUHViTGlzdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jICh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgLyogVE9ETzogQnVpbGQgdGhpcyBvdXQgb2YgRWFjaFRvcGljPFQ+LiovXG4gICAgICByZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbmhhcmRlbihtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQaW5uZWRIaXN0b3J5VG9waWMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEcacpNGDgAARg4AACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLCJtdXN0TWF0Y2giLCJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5IixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbXV0sW1wiQGVuZG8vZXhvXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIFhYWCBAYWdvcmljL3N0b3JlIHNob3VsZCBub3QgZGVwZW5kIG9uIEBhZ29yaWMvaW50ZXJuYWwqL1xuLyogVE9ETyBtb3ZlIHRvIEVuZG8qL1xuLyoqIEB0eXBlIHtNdXN0TWF0Y2h9ICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VBdG9taWNQcm92aWRlciJdLFsicHJvdmlkZUxhenkiLCJwcm92aWRlTGF6eSJdXSwiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIjpbWyJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeU1hcCJdXSwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6W1sibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlTGVnYWN5V2Vha01hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA/SRi7iCwAA4gsAACwAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgYW5kIGl0cyBmcmF0ZXJuYWwgc2libGluZyBsZWdhY3lXZWFrTWFwIGV4aXN0IG9ubHkgdG8gZWFzZSBhXG4gKiB0cmFuc2l0aW9uIHRvIHRoZSBtb2Rlcm4gYHN0b3JlYCBzeXN0ZW0sIGFyZSBkZXByZWNhdGVkLCBhbmQgd2lsbCBldmVudHVhbGx5XG4gKiBkaXNhcHBlYXIuIFRoZXkgYXJlIG5lZWRlZCBmb3Igbm93IHRvIHN1cHBvcnQgc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkXG4gKiBiZWhhdmlvciB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlXG4gKiBuZXcgaXMgdGhhdCBvbmx5IHBhc3NhYmxlcyBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksXG4gKiBzdHJ1Y3R1cmVzLCBha2EgY29tcGFyYWJsZXMpIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICpcbiAqIFRPRE8gT25jZSB0aGF0IFBSIGlzIG1lcmdlZCwgbGluayB0byB0aGUgZG9jdW1lbnRzIHJhdGhlciB0aGFuIHRoZSBQUnMuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBub24tY29uZm9ybWluZyB1c2VzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCBhXG4gKlxuICogYGBganNcbiAqIC8vIExlZ2FjeSBiZWNhdXNlLi4uXG4gKiBgYGBcbiAqXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXcgc3lzdGVtLiBTb21lXG4gKiBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKlxuICogLSBBIHByb21pc2VLaXQgdXNlZCBhcyBhIHZhbHVlLCBldmVuIHRob3VnaCBhIHByb21pc2VLaXQgaXMgbm90IGEgcGFzc2FibGUuXG4gKiAgIFNvbHV0aW9ucyBhcmUgdG8gbWFrZSBpdCBhIHBhc3NhYmxlLCBvciB0byBjb252ZXJ0IHRoZSBjb250YWluZXIgYmFjayB0byBhXG4gKiAgIGNvbnZlbnRpb25hbCBKYXZhU2NyaXB0IE1hcC5cbiAqIC0gQSBtdXRhYmxlIGFycmF5IHVzZWQgYXMgYSB2YWx1ZSwgdGhhdCBpcyBzdWJzZXF1ZW50bHkgbXV0YXRlZC4gRnJlZXppbmcgdGhlXG4gKiAgIGFycmF5IHdvdWxkbid0IHdvcmsgb2YgY291cnNlIGJlY2F1c2UgaXQgd291bGQgYnJlYWsgdGhlIHN1YnNlcXVlbnRcbiAqICAgbXV0YXRpb24uIFVzaW5nIGEgZmFyIG9iamVjdCB3cmFwcGluZyBhbiBhcnJheSB3b3VsZCBsaWtlbHkgd29yayBmaW5lLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJNYXAgaWYgcG9zc2libGUsIE1hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5TWFwPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUxlZ2FjeU1hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICBjb25zdCBtID0gbmV3IE1hcCgpO1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSBrZXkgPT5cbiAgICAhbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIG0uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4gICAgICAvKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4gICAgICAvKiBpbiB0aGlzIG1hcC4qL1xuICAgICAgcmV0dXJuIG0uaGFzKGtleSk7XG4gICAgfSxcbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICBtLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgcmV0dXJuIG0uZ2V0KGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gICAga2V5czogKCkgPT4gbS5rZXlzKCksXG4gICAgdmFsdWVzOiAoKSA9PiBtLnZhbHVlcygpLFxuICAgIGVudHJpZXM6ICgpID0+IG0uZW50cmllcygpLFxuICAgIGdldFNpemU6ICgpID0+IG0uc2l6ZSxcbiAgICBjbGVhcjogKCkgPT4gbS5jbGVhcigpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA28RCNW0HAABtBwAAMAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIHtXZWFrS2V5fSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUxlZ2FjeVdlYWtNYXAgPSAodGFnID0gJ2tleScpID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuICBjb25zdCB3bSA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICF3bS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIHdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBtYXAuKi9cbiAgICAgIHJldHVybiB3bS5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIHdtLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Vn0gKi8gKHdtLmdldChrZXkpKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5kZWxldGUoa2V5KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXoUFG6hgAAOoYAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLFskaM2PX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjNj19hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLFskaM2PX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLFskaM2PX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsWyRozY9fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7TWFwU3RvcmUsIE1hcFN0b3JlTWV0aG9kcywgU3RvcmVPcHRpb25zfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtNYXA8SywgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZU1ldGhvZHM8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFwU3RvcmVNZXRob2RzID0gKFxuICBqc21hcCxcbiAgYXNzZXJ0S1ZPa1RvQWRkLFxuICBhc3NlcnRLVk9rVG9TZXQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUsXG4gIHRhZyA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IHsgYXNzZXJ0VXBkYXRlT25BZGQsIGFzc2VydFVwZGF0ZU9uRGVsZXRlLCBpdGVyYWJsZUtleXMgfSA9XG4gICAgbWFrZUN1cnJlbnRLZXlzS2l0KFxuICAgICAgKCkgPT4ganNtYXAua2V5cygpLFxuICAgICAgayA9PiBqc21hcC5oYXMoayksXG4gICAgICBjb21wYXJlUmFuayxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgICB0YWcsXG4gICAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbiAgY29uc3Qga2V5cyA9IChrZXlQYXR0LCB2YWx1ZVBhdHQpID0+IHtcbiAgICBpZiAoa2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVLZXlzO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSBrID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ICE9PSB1bmRlZmluZWQgJiYgIW1hdGNoZXMoaywga2V5UGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLyogVXNlcyB0aGUgY3VycmVudCBqc21hcCB2YWx1ZSwgc2luY2UgdGhlIGl0ZXJhdGF0b3Igc3Vydml2ZXMgYC5zZXRgKi9cbiAgICAgIGlmICh2YWx1ZVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhqc21hcC5nZXQoayksIHZhbHVlUGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLCBmaWx0ZXIpO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxWPn1cbiAqL1xuICBjb25zdCB2YWx1ZXMgPSAoa2V5UGF0dCwgdmFsdWVQYXR0KSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiAvKiogQHR5cGUge1Z9ICovIChqc21hcC5nZXQoaykpKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssIFZdPn1cbiAqL1xuICBjb25zdCBlbnRyaWVzID0gKGtleVBhdHQsIHZhbHVlUGF0dCkgPT5cbiAgICBtYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsIHZhbHVlUGF0dCksIGsgPT4gW1xuICAgICAgayxcbiAgICAgIC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrKSksXG4gICAgXSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIC8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovIChhc3NlcnRVcGRhdGVPbkFkZCksXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICAgIHRhZyxcbiAgICApLFxuICAgIGtleXMsXG4gICAgdmFsdWVzLFxuICAgIGVudHJpZXMsXG5cbiAgICBzbmFwc2hvdDogKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCwgdmFsdWVQYXR0KSksXG5cbiAgICBnZXRTaXplOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8ganNtYXAuc2l6ZVxuICAgICAgICA6IFsuLi5rZXlzKGtleVBhdHQsIHZhbHVlUGF0dCldLmxlbmd0aCxcblxuICAgIGNsZWFyOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoa2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGpzbWFwLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsIHZhbHVlUGF0dCkpIHtcbiAgICAgICAganNtYXAuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3IgcmVmZXJlbmNpbmcgYVxuICoga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsIGBzZXRgIGFuZFxuICogYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gbWFwIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVNYXBzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEs9YW55XG4gKiBAdGVtcGxhdGUgVj1hbnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGtleVxuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge01hcFN0b3JlPEssIFY+fVxuICovJGjNj19vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhck1hcFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBrZXlTaGFwZSwgdmFsdWVTaGFwZSB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QganNtYXAgPSBuZXcgTWFwKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLVk9rVG9TZXQgPSAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKHZhbHVlKTtcblxuICAgIGFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUsICdtYXBTdG9yZSB2YWx1ZScpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhc3NlcnRLVk9rVG9BZGQgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4oa2V5KTtcblxuICAgIGFzc2VydFNjYWxhcktleShrZXkpO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ21hcFN0b3JlIGtleScpO1xuICAgIH1cbiAgICBhc3NlcnRLVk9rVG9TZXQoa2V5LCB2YWx1ZSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyTWFwU3RvcmUobWFrZVNjYWxhck1hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApkJKtRERAAAREQAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyIsIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhcixmaWx0ZXJJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlTZXQsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLFskaM2PX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kc1wiLFskaM2PX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsWyRozY9fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtTZXRTdG9yZSwgU2V0U3RvcmVNZXRob2RzLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge1NldDxLPn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1NldFN0b3JlTWV0aG9kczxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRTdG9yZU1ldGhvZHMgPSAoXG4gIGpzc2V0LFxuICBhc3NlcnRLZXlPa1RvQWRkLFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc3NldC5rZXlzKCksXG4gICAgICBrID0+IGpzc2V0LmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPEs+fVxuICovXG4gIGNvbnN0IGtleXMgPSBrZXlQYXR0ID0+XG4gICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IGl0ZXJhYmxlS2V5c1xuICAgICAgOiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGsgPT4gbWF0Y2hlcyhrLCBrZXlQYXR0KSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoXG4gICAgICBqc3NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgICAgYXNzZXJ0VXBkYXRlT25EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICksXG5cbiAgICBrZXlzLFxuXG4gICAgdmFsdWVzOiBrZXlzLFxuXG4gICAgc25hcHNob3Q6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PiBtYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkID8ganNzZXQuc2l6ZSA6IFsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbiAgICBjbGVhcjogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNzZXQuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpIHtcbiAgICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3IgcmVmZXJlbmNpbmcgYVxuICoga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsIGBzZXRgIGFuZFxuICogYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi8kaM2PX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyU2V0U3RvcmUgPSAodGFnID0gJ2tleScsIHsga2V5U2hhcGUgfSA9IHt9KSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IFNldCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnc2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCwgYXNzZXJ0S2V5T2tUb0FkZCwgdW5kZWZpbmVkLCB0YWcpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD5NfOn7RYAAO0WAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge1dlYWtNYXBTdG9yZSwgU3RvcmVPcHRpb25zfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gKFxuICBqc21hcCxcbiAgYXNzZXJ0S1ZPa1RvQWRkLFxuICBhc3NlcnRLVk9rVG9TZXQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSBrZXkgPT5cbiAgICAhanNtYXAuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgbWFwLiovXG4gICAgICByZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIC8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbiAgICAgIHJldHVybiAvKiogQHR5cGUge1Z9ICovIChqc21hcC5nZXQoa2V5KSk7XG4gICAgfSxcblxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzbWFwLmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IGVudHJpZXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBlbnRyaWVzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihlbnRyaWVzKSAmJiBpc0NvcHlNYXAoZW50cmllcykpIHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCovXG4gICAgICAgICAgZW50cmllcyA9IGdldENvcHlNYXBFbnRyaWVzKGVudHJpZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEZhaWxgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2VudHJpZXN9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgLyoqIEB0eXBlIHtJdGVyYWJsZTxbSywgVl0+fSAqLyAoZW50cmllcykpIHtcbiAgICAgICAgLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuICAgICAgICBhc3NlcnRLVk9rVG9BZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIF9zY2FsYXJfIG1hcFN0b3JlIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlczpcbiAqIHByaW1pdGl2ZXMgb3IgcmVtb3RhYmxlcy4gT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSxcbiAqIGNvcHlBcnJheXMgYW5kIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZlxuICogdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtNYXAgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtNYXAgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXQgaXRcbiAqIHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIG1hcC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZSByZW1vdGFibGVzLFxuICogc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyByZWFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1JlbW90YWJsZU9iamVjdCAmIFdlYWtNYXBTdG9yZTxLLCBWPn1cbiAqLyRozY9fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQsIHZhbHVlU2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbiAgY29uc3QganNtYXAgPSBsb25nTGl2ZWQgPyBuZXcgV2Vha01hcCgpIDogbmV3IE1hcCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG4gIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvU2V0ID0gKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbih2YWx1ZSk7XG5cbiAgICBhc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlLCAnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S1ZPa1RvU2V0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFnLFxuICAgICksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACUWqUbThEAAE4RAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleX0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7U3RvcmVPcHRpb25zLCBXZWFrU2V0U3RvcmUsIFdlYWtTZXRTdG9yZU1ldGhvZHN9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7V2Vha1NldDxLICYgb2JqZWN0Pn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZU1ldGhvZHM8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBqc3NldC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgc2V0LiovXG4gICAgICByZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gICAgfSxcblxuICAgIGFkZDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleU9rVG9BZGQoa2V5KTtcbiAgICAgIGpzc2V0LmFkZChrZXkpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzc2V0LmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IGtleXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBrZXlzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXlzKSAmJiBpc0NvcHlTZXQoa2V5cykpIHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCovXG4gICAgICAgICAga2V5cyA9IGdldENvcHlTZXRLZXlzKGtleXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEZhaWxgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgLyoqIEB0eXBlIHtJdGVyYWJsZTxLPn0gKi8gKGtleXMpKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9BZGQoa2V5KTtcbiAgICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dCBpdFxuICogc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlIHJlbW90YWJsZXMsXG4gKiBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi8kaM2PX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGxvbmdMaXZlZCA9IHRydWUsIGtleVNoYXBlID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc3NldCA9IG5ldyAobG9uZ0xpdmVkID8gV2Vha1NldCA6IFNldCkoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtleU9rVG9BZGQgPSBrZXkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4oa2V5KTtcbiAgICBwYXNzU3R5bGVPZihrZXkpID09PSAncmVtb3RhYmxlJyB8fFxuICAgICAgRmFpbGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtTdG9yZXM6ICR7a2V5fWA7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnd2Vha1NldFN0b3JlIGtleScpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgV2Vha1NldFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCwgYXNzZXJ0S2V5T2tUb0FkZCwgdW5kZWZpbmVkLCB0YWcpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUobWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqlfvLtsaAADbGgAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSIsImlzQ29weU1hcCIsImlzQ29weVNldCIsIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VDdXJyZW50S2V5c0tpdCIsInByb3ZpZGVMYXp5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEZhcixpc0NvcHlNYXAsaXNDb3B5U2V0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcImlzQ29weU1hcFwiXV1dLFtcImlzQ29weVNldFwiLFskaM2PX2EgPT4gKGlzQ29weVNldCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5U2V0XCJdXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmFibGU8Sz59IGdldFJhd0tleXNcbiAqIEBwYXJhbSB7KGs6IEspID0+IGJvb2xlYW59IGNoZWNrSGFzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0geyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydE9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7Q3VycmVudEtleXNLaXQ8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ3VycmVudEtleXNLaXQgPSAoXG4gIGdldFJhd0tleXMsXG4gIGNoZWNrSGFzLFxuICBjb21wYXJlLFxuICBhc3NlcnRPa1RvQWRkLFxuICBhc3NlcnRPa1RvRGVsZXRlLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgbGV0IHVwZGF0ZUNvdW50ID0gMDtcbiAgLyoqIEB0eXBlIHtBcnJheTxLPiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHNvcnRlZEtleXNNZW1vO1xuXG4gIGNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkID0gKGssIHYgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRPa1RvQWRkKGssIHYpO1xuICAgIHVwZGF0ZUNvdW50ICs9IDE7XG4gICAgc29ydGVkS2V5c01lbW8gPSB1bmRlZmluZWQ7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGUgPSBrID0+IGFzc2VydE9rVG9EZWxldGUgJiYgYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuICBjb25zdCBnZXRTb3J0ZWRLZXlzID0gKCkgPT4ge1xuICAgIGlmIChzb3J0ZWRLZXlzTWVtbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb3J0ZWRLZXlzTWVtbyA9IGhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuICB9O1xuXG4gIGNvbnN0IGl0ZXJhYmxlS2V5cyA9IEZhcignSXRlcmFibGUgb2Yga2V5cycsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHVwZGF0ZUNvdW50O1xuICAgICAgZ2V0U29ydGVkS2V5cygpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUUyBkb2Vzbid0IHRyYWNrIHRoYXQgc29ydGVkS2V5c01lbW8gaXMgZGVmaW5lZCovXG4gICAgICBjb25zdCBsZW4gPSBzb3J0ZWRLZXlzTWVtby5sZW5ndGg7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZ2VuZXJhdGlvbiA9PT0gdXBkYXRlQ291bnQgfHwgRmFpbGBTdG9yZSAke3Eoa2V5TmFtZSl9IGN1cnNvciBzdGFsZWA7XG4gICAgICAgICAgLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuICAgICAgICAgIC8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVFMgZG9lc24ndCB0cmFjayB0aGF0IHNvcnRlZEtleXNNZW1vIGlzIGRlZmluZWQqL1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvcnRlZEtleXNNZW1vW2ldO1xuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgIGlmIChjaGVja0hhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKC8qKiBAdHlwZSB7Y29uc3R9ICovICh7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtjb25zdH0gKi8gKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBhc3NlcnRVcGRhdGVPbkFkZCxcbiAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICBpdGVyYWJsZUtleXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiBJZiB0aGVyZVxuICogYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXNcbiAqIHRoZSB2YWx1ZSBmb3IgdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuICAgICAgIGNvbnN0IHByb3ZpZGVMYXp5ID0gKG1hcFN0b3JlLCBrZXksIG1ha2VWYWx1ZSkgPT4ge1xuICBpZiAoIW1hcFN0b3JlLmhhcyhrZXkpKSB7XG4gICAgbWFwU3RvcmUuaW5pdChrZXksIG1ha2VWYWx1ZShrZXkpKTtcbiAgfVxuICByZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG59OyRozY9fb25jZS5wcm92aWRlTGF6eShwcm92aWRlTGF6eSk7XG5oYXJkZW4ocHJvdmlkZUxhenkpO1xuXG4vKipcbiAqIEhlbHBlciBmb3IgdXNlIGNhc2VzIGluIHdoaWNoIHRoZSBtYWtlciBmdW5jdGlvbiBpcyBhc3luYy4gRm9yIHR3b1xuICogcHJvdmlkZUxhenkgY2FsbHMgd2l0aCB0aGUgc2FtZSBrZXksIG9uZSBtYXkgYmUgbWFraW5nIHdoZW4gdGhlIG90aGVyIGNhbGxcbiAqIHN0YXJ0cyBhbmQgaXQgd291bGQgbWFrZSBhZ2Fpbi4gKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmRcbiAqIHRyaWVzIHRvIHN0b3JlIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHlcbiAqIHN0b3JpbmcgYSBQcm9taXNlIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG4gICAgICAgY29uc3QgbWFrZUF0b21pY1Byb3ZpZGVyID0gc3RvcmUgPT4ge1xuICAvKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbiAgY29uc3QgcGVuZGluZyA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCB3aGVuXG4gKiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvciB0aGF0IGtleSwgYW5kIHJldHVyblxuICogaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmUgaWZcbiAqICAgaXQgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgdGhlIGxhc3QgbWFrZSBmYWlsZWRcbiAqIEBwYXJhbSB7KGtleTogSywgdmFsdWU6IFYpID0+IFByb21pc2U8dm9pZD59IFtmaW5pc2hWYWx1ZV0gcnVucyBleGFjdGx5XG4gKiAgIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuICBjb25zdCBwcm92aWRlQXN5bmMgPSAoa2V5LCBtYWtlVmFsdWUsIGZpbmlzaFZhbHVlKSA9PiB7XG4gICAgaWYgKHN0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiAgICB9XG4gICAgaWYgKCFwZW5kaW5nLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB2YWxQID0gbWFrZVZhbHVlKGtleSlcbiAgICAgICAgLnRoZW4odiA9PiB7XG4gICAgICAgICAgc3RvcmUuaW5pdChrZXksIHYpO1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBpZiAoZmluaXNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hWYWx1ZShrZXksIHYpLnRoZW4oKCkgPT4gdik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgcGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICBwZW5kaW5nLnNldChrZXksIHZhbFApO1xuICAgIH1cbiAgICBjb25zdCB2YWxQID0gcGVuZGluZy5nZXQoa2V5KTtcbiAgICBhc3NlcnQodmFsUCk7XG4gICAgcmV0dXJuIHZhbFA7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IHByb3ZpZGVBc3luYyB9KTtcbn07JGjNj19vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZUF0b21pY1Byb3ZpZGVyPEssIFY+Pn0gQXRvbWljUHJvdmlkZXI8SywgVj5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcFN0b3JlPEssIFZbXT59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHtWfSBpdGVtXG4gKi9cbiAgICAgICBjb25zdCBhcHBlbmRUb1N0b3JlZEFycmF5ID0gKG1hcFN0b3JlLCBrZXksIGl0ZW0pID0+IHtcbiAgaWYgKG1hcFN0b3JlLmhhcyhrZXkpKSB7XG4gICAgY29uc3QgZXh0YW50ID0gbWFwU3RvcmUuZ2V0KGtleSk7XG4gICAgbWFwU3RvcmUuc2V0KGtleSwgaGFyZGVuKFsuLi5leHRhbnQsIGl0ZW1dKSk7XG4gIH0gZWxzZSB7XG4gICAgbWFwU3RvcmUuaW5pdChrZXksIGhhcmRlbihbaXRlbV0pKTtcbiAgfVxufTskaM2PX29uY2UuYXBwZW5kVG9TdG9yZWRBcnJheShhcHBlbmRUb1N0b3JlZEFycmF5KTtcbmhhcmRlbihhcHBlbmRUb1N0b3JlZEFycmF5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiLGZhbHNlXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdLCJhcHBlbmRUb1N0b3JlZEFycmF5IjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADt9ZibMAIAADACAAAcAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3RpbWVNYXRoLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0M22UCiUAAAolAAAjAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIlRpbWVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LEZhaWwscSxtdXN0TWF0Y2gsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVsYXRpdmVUaW1lLCBSZWxhdGl2ZVRpbWVWYWx1ZSwgVGltZXJCcmFuZCwgVGltZU1hdGhUeXBlLCBUaW1lc3RhbXAsIFRpbWVzdGFtcFJlY29yZCwgVGltZXN0YW1wVmFsdWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7UmFua0NvbXBhcmlzb259IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKlxuICogYGFncmVlZFRpbWVyQnJhbmRgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gbGVmdEJyYW5kXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IHJpZ2h0QnJhbmRcbiAqIEByZXR1cm5zIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBhZ3JlZWRUaW1lckJyYW5kID0gKGxlZnRCcmFuZCwgcmlnaHRCcmFuZCkgPT4ge1xuICBpZiAobGVmdEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocmlnaHRCcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmlnaHRCcmFuZDtcbiAgICB9XG4gIH0gZWxzZSBpZiAocmlnaHRCcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxlZnRCcmFuZDtcbiAgfSBlbHNlIHtcbiAgICBsZWZ0QnJhbmQgPT09IHJpZ2h0QnJhbmQgfHxcbiAgICAgIEZhaWxgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xuICAgIHJldHVybiBsZWZ0QnJhbmQ7XG4gIH1cbn07XG5cbi8qKlxuICogYHNoYXJlZFRpbWVyQnJhbmRgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgaW1wbGVtZW50cyB0aGVcbiAqIHRyYW5zaXRpb25hbCBicmFuZCBjaGVja2luZyBhbmQgY29udGFpZ2lvbiBsb2dpYyBleHBsYWluZWQgaW4gdGhlIGBUaW1lTWF0aGBcbiAqIGNvbW1lbnQuIEl0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBiaW5hcnkgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIGZvbGxvd1xuICogdGhpcyBsb2dpYy4gSXQgZG9lcyB0aGUgZXJyb3IgY2hlY2tpbmcgYmV0d2VlbiB0aGUgb3BlcmFuZHMsIGFuZCByZXR1cm5zXG4gKiB0aGUgYnJhbmQsIGlmIGFueSwgdGhhdCBzaG91bGQgbGFiZWwgdGhlIHJlc3VsdGluZyB0aW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBzaGFyZWRUaW1lckJyYW5kID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGNvbnN0IGxlZnRCcmFuZCA9IHR5cGVvZiBsZWZ0ID09PSAnYmlnaW50JyA/IHVuZGVmaW5lZCA6IGxlZnQudGltZXJCcmFuZDtcbiAgY29uc3QgcmlnaHRCcmFuZCA9IHR5cGVvZiByaWdodCA9PT0gJ2JpZ2ludCcgPyB1bmRlZmluZWQgOiByaWdodC50aW1lckJyYW5kO1xuICByZXR1cm4gYWdyZWVkVGltZXJCcmFuZChsZWZ0QnJhbmQsIHJpZ2h0QnJhbmQpO1xufTtcblxuLyoqXG4gKiBgYWJzTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFRpbWVzdGFtcGBcbiAqIHJhdGhlciB0aGFuIGEgYFJlbGF0aXZlVGltZWAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtUaW1lc3RhbXBWYWx1ZX0gYWJzVmFsdWVcbiAqIEByZXR1cm5zIHtUaW1lc3RhbXB9XG4gKi9cbmNvbnN0IGFic0xpa2UgPSAobGVmdCwgcmlnaHQsIGFic1ZhbHVlKSA9PiB7XG4gIE5hdChhYnNWYWx1ZSk7XG4gIGNvbnN0IHRpbWVyQnJhbmQgPSBzaGFyZWRUaW1lckJyYW5kKGxlZnQsIHJpZ2h0KTtcbiAgaWYgKHRpbWVyQnJhbmQpIHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHRpbWVyQnJhbmQsXG4gICAgICBhYnNWYWx1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYWJzVmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogYHJlbExpa2VgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeVxuICogb3BlcmF0b3JzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBhIGBSZWxhdGl2ZVRpbWVgXG4gKiByYXRoZXIgdGhhbiBhIGBUaW1lc3RhbXBgLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7UmVsYXRpdmVUaW1lVmFsdWV9IHJlbFZhbHVlXG4gKiBAcmV0dXJucyB7UmVsYXRpdmVUaW1lfVxuICovXG5jb25zdCByZWxMaWtlID0gKGxlZnQsIHJpZ2h0LCByZWxWYWx1ZSkgPT4ge1xuICBOYXQocmVsVmFsdWUpO1xuICBjb25zdCB0aW1lckJyYW5kID0gc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh0aW1lckJyYW5kKSB7XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICB0aW1lckJyYW5kLFxuICAgICAgcmVsVmFsdWUsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlbFZhbHVlO1xuICB9XG59O1xuXG4vKiBGb3IgYWxsIHRoZSBmb2xsb3dpbmcgdGltZSBvcGVyYXRvcnMsIHRoZWlyIGRvY3VtZW50YXRpb24gaXMgaW4qL1xuLyogdGhlIGBUaW1lTWF0aFR5cGVgLCBzaW5jZSB0aGF0IGlzIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgc2hvd3MgdXAqL1xuLyogaW4gdGhlIElERS4gV2VsbCwgYXQgbGVhc3QgdGhlIHZzY29kZSBJREUuKi9cblxuY29uc3QgYWJzVmFsdWUgPSBhYnMgPT4ge1xuICBpZiAodHlwZW9mIGFicyA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gTmF0KGFicyk7XG4gIH1cbiAgbXVzdE1hdGNoKGFicywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgcmV0dXJuIE5hdChhYnMuYWJzVmFsdWUpO1xufTtcblxuY29uc3QgcmVsVmFsdWUgPSByZWwgPT4ge1xuICBpZiAodHlwZW9mIHJlbCA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gTmF0KHJlbCk7XG4gIH1cbiAgbXVzdE1hdGNoKHJlbCwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsICdyZWxhdGl2ZScpO1xuICByZXR1cm4gTmF0KHJlbC5yZWxWYWx1ZSk7XG59O1xuXG5jb25zdCBtYWtlVGltZXN0YW1wUmVjb3JkID0gKGFicywgdGltZXJCcmFuZCkgPT5cbiAgaGFyZGVuKHsgYWJzVmFsdWU6IGFicywgdGltZXJCcmFuZCB9KTtcbmNvbnN0IG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQgPSAocmVsLCB0aW1lckJyYW5kKSA9PlxuICBoYXJkZW4oeyByZWxWYWx1ZTogcmVsLCB0aW1lckJyYW5kIH0pO1xuXG5jb25zdCBjb2VyY2VUaW1lc3RhbXBSZWNvcmQgPSAodHMsIGJyYW5kKSA9PiB7XG4gIGJyYW5kIHx8IEZhaWxgbXVzdCBoYXZlIGEgYnJhbmRgO1xuICBpZiAodHlwZW9mIHRzID09PSAnbnVtYmVyJykge1xuICAgIHRzID0gTmF0KHRzKTtcbiAgfVxuICBpZiAodHlwZW9mIHRzID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBtYWtlVGltZXN0YW1wUmVjb3JkKHRzLCBicmFuZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgeyB0aW1lckJyYW5kIH0gPSB0cztcbiAgICBtdXN0TWF0Y2godHMsIFRpbWVzdGFtcFJlY29yZFNoYXBlLCAndGltZXN0YW1wJyk7XG4gICAgYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLCBicmFuZCk7XG4gICAgcmV0dXJuIHRzO1xuICB9XG59O1xuXG5jb25zdCBjb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQgPSAocnQsIGJyYW5kKSA9PiB7XG4gIGJyYW5kIHx8IEZhaWxgbXVzdCBoYXZlIGEgYnJhbmRgO1xuICBpZiAodHlwZW9mIHJ0ID09PSAnbnVtYmVyJykge1xuICAgIHJ0ID0gTmF0KHJ0KTtcbiAgfVxuICBpZiAodHlwZW9mIHJ0ID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkKHJ0LCBicmFuZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgeyB0aW1lckJyYW5kIH0gPSBydDtcbiAgICBtdXN0TWF0Y2gocnQsIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCAncmVsYXRpdmVUaW1lJyk7XG4gICAgYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLCBicmFuZCk7XG4gICAgcmV0dXJuIHJ0O1xuICB9XG59O1xuXG5jb25zdCBhZGRBYnNSZWwgPSAoYWJzLCByZWwpID0+XG4gIGFic0xpa2UoYWJzLCByZWwsIGFic1ZhbHVlKGFicykgKyByZWxWYWx1ZShyZWwpKTtcblxuY29uc3QgYWRkUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+XG4gIHJlbExpa2UocmVsMSwgcmVsMiwgcmVsVmFsdWUocmVsMSkgKyByZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+XG4gIHJlbExpa2UoYWJzMSwgYWJzMiwgYWJzVmFsdWUoYWJzMSkgLSBhYnNWYWx1ZShhYnMyKSk7XG5cbmNvbnN0IGNsYW1wZWRTdWJ0cmFjdEFic0FicyA9IChhYnMxLCBhYnMyKSA9PiB7XG4gIGNvbnN0IHZhbDEgPSBhYnNWYWx1ZShhYnMxKTtcbiAgY29uc3QgdmFsMiA9IGFic1ZhbHVlKGFiczIpO1xuICByZXR1cm4gcmVsTGlrZShhYnMxLCBhYnMyLCB2YWwxID4gdmFsMiA/IHZhbDEgLSB2YWwyIDogMG4pO1xufTtcblxuY29uc3Qgc3VidHJhY3RBYnNSZWwgPSAoYWJzLCByZWwpID0+XG4gIGFic0xpa2UoYWJzLCByZWwsIGFic1ZhbHVlKGFicykgLSByZWxWYWx1ZShyZWwpKTtcblxuY29uc3Qgc3VidHJhY3RSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbiAgcmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSAtIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvID0gcmVsID0+IHJlbFZhbHVlKHJlbCkgPT09IDBuO1xuXG5jb25zdCBtdWx0aXBseVJlbE5hdCA9IChyZWwsIG5hdCkgPT4gcmVsTGlrZShyZWwsIG5hdCwgcmVsVmFsdWUocmVsKSAqIG5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbE5hdCA9IChyZWwsIG5hdCkgPT4gcmVsTGlrZShyZWwsIG5hdCwgcmVsVmFsdWUocmVsKSAvIG5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbFJlbCA9IChyZWwxLCByZWwyKSA9PiB7XG4gIHNoYXJlZFRpbWVyQnJhbmQocmVsMSwgcmVsMik7IC8qIGp1c3QgZXJyb3IgY2hlY2sqL1xuICByZXR1cm4gcmVsVmFsdWUocmVsMSkgLyByZWxWYWx1ZShyZWwyKTtcbn07XG5cbmNvbnN0IG1vZEFic1JlbCA9IChhYnMsIHN0ZXApID0+XG4gIHJlbExpa2UoYWJzLCBzdGVwLCBhYnNWYWx1ZShhYnMpICUgcmVsVmFsdWUoc3RlcCkpO1xuXG5jb25zdCBtb2RSZWxSZWwgPSAocmVsLCBzdGVwKSA9PlxuICByZWxMaWtlKHJlbCwgc3RlcCwgcmVsVmFsdWUocmVsKSAlIHJlbFZhbHVlKHN0ZXApKTtcblxuLyoqXG4gKiBgY29tcGFyZVZhbHVlc2AgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudFxuICogdGhlIHRpbWUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtiaWdpbnR9IHYxXG4gKiBAcGFyYW0ge2JpZ2ludH0gdjJcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgY29tcGFyZVZhbHVlcyA9IChsZWZ0LCByaWdodCwgdjEsIHYyKSA9PiB7XG4gIHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodjEgPCB2Mikge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmICh2MSA9PT0gdjIpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQodjEgPiB2Mik7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGBUaW1lTWF0aGAgb2JqZWN0IHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWMgb24gbGFiZWxlZFxuICogdGltZSB2YWx1ZXMsIG11Y2ggbGlrZSBgQW1vdW50TWF0aGAgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpY1xuICogb24gbGFiZWxlZCBhc3NldC9tb25leSB2YWx1ZXMuIEJvdGggY2hlY2sgZm9yIGNvbnNpc3RlbmN5IG9mIGxhYmVsczogYVxuICogYmluYXJ5IG9wZXJhdGlvbiBvbiB0d28gbGFiZWxlZCBvYmplY3RzIGVuc3VyZXMgdGhhdCB0aGUgYm90aCBjYXJyeVxuICogdGhlIHNhbWUgbGFiZWwuIElmIHRoZXkgcHJvZHVjZSBhbm90aGVyIG9iamVjdCBmcm9tIHRoZSBzYW1lIGRvbWFpbiwgaXRcbiAqIHdpbGwgY2FycnkgdGhlIHNhbWUgbGFiZWwuIElmIHRoZSBvcGVyYW5kcyBoYXZlIGluY29tcGF0aWJsZSBsYWJlbHMsXG4gKiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogVW5saWtlIGFtb3VudCBhcml0aG1ldGljLCB0aW1lIGFyaXRobWV0aWMgZGVhbHMgaW4gdHdvIGtpbmRzIG9mIHRpbWUgb2JqZWN0czpcbiAqIFRpbWVzdGFtcHMsIHdoaWNoIHJlcHJlc2VudCBhYnNvbHV0ZSB0aW1lLCBhbmQgUmVsYXRpdmVUaW1lLCB3aGljaCByZXByZXNlbnRzXG4gKiB0aGUgZHVyYXRpb24gYmV0d2VlbiB0d28gYWJzb2x1dGUgdGltZXMuIEJvdGgga2luZHMgb2YgdGltZSBvYmplY3RcbiAqIGFyZSBsYWJlbGVkIGJ5IGEgYFRpbWVyQnJhbmRgLiBGb3IgYSBUaW1lc3RhbXAgb2JqZWN0LCB0aGUgdmFsdWUgaXNcbiAqIGEgYmlnaW50IGluIGFuIGBhYnNWYWx1ZWAgcHJvcGVydHkuIEZvciBhIFJlbGF0aXZlVGltZSBvYmplY3QsIHRoZSB2YWx1ZVxuICogaXMgYSBiaWdpbnQgaW4gYSBgcmVsVmFsdWVgIHByb3BlcnR5LiBUaHVzIHdlIGhhdmUgYSBydW50aW1lIHNhZmV0eSBjaGVja1xuICogdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgY29uZnVzZWQgdGhlIHR3bywgZXZlbiBpZiB3ZSBoYXZlIG1hbmFnZWQgdG8gZm9vbFxuICogdGhlICh1bnNvdW5kKSBzdGF0aWMgdHlwZSBzeXN0ZW0uXG4gKlxuICogQXMgYSB0cmFuc2l0aW9uYWwgbWVhc3VyZSwgY3VycmVudGx5IG1hbnkgVGltZXN0YW1wcyBhbmQgUmVsYXRpdmVUaW1lcyBhcmVcbiAqIHN0aWxsIHJlcHJlc2VudGVkIGJ5IHVubGFiZWxlZCBiaWdpbnRzLiBEdXJpbmcgdGhpcyB0cmFuc2l0aW9uYWwgcGVyaW9kLFxuICogd2UgYWxsb3cgdGhpcywgYm90aCBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseS4gRm9yIGEgbm9ybWFsIGJpbmFyeVxuICogb3BlcmF0aW9uLCBpZiBib3RoIGlucHV0cyBhcmUgbGFiZWxlZCwgdGhlbiB3ZSBkbyB0aGUgZnVsbCBjaGVja2luZyBhc1xuICogZXhwbGFpbmVkIGFib3ZlIGFuZCByZXR1cm4gYSBsYWJlbGVkIHJlc3VsdC4gSWYgYm90aCBpbnB1dHMgYXJlIHVubGFiZWxlZFxuICogYmlnaW50cywgd2UgKmFzc3VtZSogdGhhdCB0aGV5IGluZGljYXRlIGEgdGltZSBvZiB0aGUgcmlnaHQga2luZFxuICogKFRpbWVzdGFtcCB2cyBSZWxhdGl2ZVRpbWUpIGFuZCB0aW1lciBicmFuZC4gU2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0XG4gKiBicmFuZCB3YXMgaW50ZW5kZWQsIHdlIGNhbiBvbmx5IHJldHVybiB5ZXQgYW5vdGhlciB1bmxhYmVsZWQgYmlnaW50LlxuICpcbiAqIElmIG9uZSBvcGVyYW5kIGlzIGxhYmVsZWQgYW5kIHRoZSBvdGhlciBpcyBub3QsIHdlIGNoZWNrIHRoZSBsYWJlbGVkIG9wZXJhbmQsXG4gKiAqYXNzdW1lKiB0aGUgdW5sYWJlbGVkIGJpZ2ludCByZXByZXNlbnRzIHRoZSB2YWx1ZSBuZWVkZWQgZm9yIHRoZSBvdGhlclxuICogb3BlcmFuZCwgYW5kIHJldHVybiBhIGxhYmVsZWQgdGltZSBvYmplY3Qgd2l0aCB0aGUgYnJhbmQgb2YgdGhlIGxhYmVsZWRcbiAqIG9wZXJhbmQuXG4gKlxuICogQHR5cGUge1RpbWVNYXRoVHlwZX1cbiAqL1xuICAgICAgIGNvbnN0IFRpbWVNYXRoID0gaGFyZGVuKHtcbiAgYWJzVmFsdWUsXG4gIHJlbFZhbHVlLFxuICBjb2VyY2VUaW1lc3RhbXBSZWNvcmQsXG4gIGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB4eHggZHluYW1pYyB0eXBpbmcqL1xuICBhZGRBYnNSZWwsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgeHh4IGR5bmFtaWMgdHlwaW5nKi9cbiAgYWRkUmVsUmVsLFxuICBzdWJ0cmFjdEFic0FicyxcbiAgY2xhbXBlZFN1YnRyYWN0QWJzQWJzLFxuICBzdWJ0cmFjdEFic1JlbCxcbiAgc3VidHJhY3RSZWxSZWwsXG4gIGlzUmVsWmVybyxcbiAgbXVsdGlwbHlSZWxOYXQsXG4gIGRpdmlkZVJlbE5hdCxcbiAgZGl2aWRlUmVsUmVsLFxuICBtb2RBYnNSZWwsXG4gIG1vZFJlbFJlbCxcbiAgY29tcGFyZUFiczogKGFiczEsIGFiczIpID0+XG4gICAgY29tcGFyZVZhbHVlcyhhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSwgYWJzVmFsdWUoYWJzMikpLFxuICBjb21wYXJlUmVsOiAocmVsMSwgcmVsMikgPT5cbiAgICBjb21wYXJlVmFsdWVzKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpLCByZWxWYWx1ZShyZWwyKSksXG59KTskaM2PX29uY2UuVGltZU1hdGgoVGltZU1hdGgpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZU1hdGgiOlsiVGltZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANPYVxPMJAADzCQAAJQAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSIsIlJlbGF0aXZlVGltZVNoYXBlIiwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSIsIlRpbWVyQnJhbmRTaGFwZSIsIlRpbWVyU2VydmljZVNoYXBlIiwiVGltZXN0YW1wUmVjb3JkU2hhcGUiLCJUaW1lc3RhbXBTaGFwZSIsIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7VGltZXN0YW1wUmVjb3JkLCBUaW1lc3RhbXBWYWx1ZSwgUmVsYXRpdmVUaW1lVmFsdWUsIFJlbGF0aXZlVGltZVJlY29yZH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IFRpbWVyQnJhbmRTaGFwZSA9IE0ucmVtb3RhYmxlKCdUaW1lckJyYW5kJyk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGJpZ2ludD59ICovJGjNj19vbmNlLlRpbWVyQnJhbmRTaGFwZShUaW1lckJyYW5kU2hhcGUpO1xuICAgICAgIGNvbnN0IFRpbWVzdGFtcFZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxiaWdpbnQ+fSAqLyRozY9fb25jZS5UaW1lc3RhbXBWYWx1ZVNoYXBlKFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuICAgICAgIGNvbnN0IFJlbGF0aXZlVGltZVZhbHVlU2hhcGUgPSBNLm5hdCgpOyAvKiBTaG91bGQgd2UgYWxsb3cgbmVnYXRpdmVzPyovXG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFRpbWVzdGFtcFJlY29yZD59ICovJGjNj19vbmNlLlJlbGF0aXZlVGltZVZhbHVlU2hhcGUoUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXN0YW1wUmVjb3JkU2hhcGUgPSB7XG4gIHRpbWVyQnJhbmQ6IFRpbWVyQnJhbmRTaGFwZSxcbiAgYWJzVmFsdWU6IFRpbWVzdGFtcFZhbHVlU2hhcGUsXG59OyRozY9fb25jZS5UaW1lc3RhbXBSZWNvcmRTaGFwZShUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5oYXJkZW4oVGltZXN0YW1wUmVjb3JkU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxSZWxhdGl2ZVRpbWVSZWNvcmQ+fSAqL1xuICAgICAgIGNvbnN0IFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0ge1xuICB0aW1lckJyYW5kOiBUaW1lckJyYW5kU2hhcGUsXG4gIHJlbFZhbHVlOiBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlLFxufTskaM2PX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuaGFyZGVuKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48VGltZXN0YW1wUmVjb3JkIHwgVGltZXN0YW1wVmFsdWU+fSAqL1xuICAgICAgIGNvbnN0IFRpbWVzdGFtcFNoYXBlID0gTS5vcihUaW1lc3RhbXBSZWNvcmRTaGFwZSwgVGltZXN0YW1wVmFsdWVTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJlbGF0aXZlVGltZVJlY29yZCB8IFJlbGF0aXZlVGltZVZhbHVlPn0gKi8kaM2PX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuICAgICAgIGNvbnN0IFJlbGF0aXZlVGltZVNoYXBlID0gTS5vcihcbiAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsXG4gIFJlbGF0aXZlVGltZVZhbHVlU2hhcGUsXG4pOyRozY9fb25jZS5SZWxhdGl2ZVRpbWVTaGFwZShSZWxhdGl2ZVRpbWVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBUaW1lclNlcnZpY2VTaGFwZSA9IE0ucmVtb3RhYmxlKCdUaW1lclNlcnZpY2UnKTskaM2PX29uY2UuVGltZXJTZXJ2aWNlU2hhcGUoVGltZXJTZXJ2aWNlU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZXJCcmFuZFNoYXBlIjpbIlRpbWVyQnJhbmRTaGFwZSJdLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIjpbIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIl0sIlRpbWVzdGFtcFJlY29yZFNoYXBlIjpbIlRpbWVzdGFtcFJlY29yZFNoYXBlIl0sIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIl0sIlRpbWVzdGFtcFNoYXBlIjpbIlRpbWVzdGFtcFNoYXBlIl0sIlJlbGF0aXZlVGltZVNoYXBlIjpbIlJlbGF0aXZlVGltZVNoYXBlIl0sIlRpbWVyU2VydmljZVNoYXBlIjpbIlRpbWVyU2VydmljZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2D1iULSwAAC0sAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dLFtcIlZhdERhdGFcIixbJGjNj19hID0+IChnbG9iYWxWYXREYXRhID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7QmFnZ2FnZSwgRGVmaW5lS2luZE9wdGlvbnMsIER1cmFibGVLaW5kSGFuZGxlLCBJbnRlcmZhY2VHdWFyZEtpdH0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7UGx1c0NvbnRleHR9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ZhdERhdGF9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ByZXBhcmVLaW5kfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtQcmVwYXJlS2luZE11bHRpfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtHdWFyZGVkfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7R3VhcmRlZEtpdH0gZnJvbSAnQGVuZG8vZXhvJztcbiAqL1xuXG4vKiBTb21lIGZlZWRiYWNrIGlmIHRoZSBpbml0IGZ1bmN0aW9uIGlzIGFzeW5jKi9cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJbml0U3RhdGVcbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSVxuICogQHR5cGVkZWYge1JldHVyblR5cGU8ST4gZXh0ZW5kcyBQcm9taXNlPGFueT4gPyBuZXZlciA6IFJldHVyblR5cGU8ST59IFN0YXRlUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXQgaWdub3Jlc1xuICogaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueSkgPT4gYW55PihcbiAqICAgZm46IFQsXG4gKiApID0+IFBsdXNDb250ZXh0PG5ldmVyLCBUPn1cbiAqL1xuICAgICAgIGNvbnN0IGlnbm9yZUNvbnRleHQgPVxuICBmbiA9PlxuICAoX2NvbnRleHQsIC4uLmFyZ3MpID0+XG4gICAgZm4oLi4uYXJncyk7JGjNj19vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuLyoqIEBwYXJhbSB7VmF0RGF0YX0gVmF0RGF0YSAqL1xuICAgICAgIGNvbnN0IG1ha2VFeG9VdGlscyA9IFZhdERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgZGVmaW5lS2luZCxcbiAgICBkZWZpbmVLaW5kTXVsdGksXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbiAgICBtYWtlS2luZEhhbmRsZSxcbiAgfSA9IFZhdERhdGE7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7RHVyYWJsZUtpbmRIYW5kbGV9XG4gKi9cbiAgY29uc3QgcHJvdmlkZUtpbmRIYW5kbGUgPSAoYmFnZ2FnZSwga2luZE5hbWUpID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsICgpID0+IG1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG4gIGhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtQcmVwYXJlS2luZH1cbiAqL1xuICBjb25zdCBwcmVwYXJlS2luZCA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGluaXQsXG4gICAgYmVoYXZpb3IsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PlxuICAgIGRlZmluZUR1cmFibGVLaW5kKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW5pdCxcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4gIC8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7UHJlcGFyZUtpbmRNdWx0aX1cbiAqL1xuICBjb25zdCBwcmVwYXJlS2luZE11bHRpID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbiAgICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICAgIGluaXQsXG4gICAgICBiZWhhdmlvcixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIFQgYmVoYXZpb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIGluaXQsIG1ldGhvZHMsIG9wdGlvbnMpID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVLaW5kKHRhZywgaW5pdCwgbWV0aG9kcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmRLaXQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBmYWNldHM6IEd1YXJkZWRLaXQ8VD47XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgZmFjZXRzOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWRLaXQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0ID0gKFxuICAgIHRhZyxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVLaW5kTXVsdGkodGFnLCBpbml0LCBmYWNldHMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIH0pO1xuICBoYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgc2VsZjogVDtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkPFQ+fVxuICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcyA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVEdXJhYmxlS2luZChraW5kSGFuZGxlLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQgPSAoXG4gICAga2luZEhhbmRsZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKGtpbmRIYW5kbGUsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgc2VsZjogUmVtb3RhYmxlT2JqZWN0ICYgVDtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkPFQ+fVxuICovXG4gIGNvbnN0IHByZXBhcmVFeG9DbGFzcyA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgICBpbml0LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmRLaXQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBmYWNldHM6IEd1YXJkZWRLaXQ8VD47XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgZmFjZXRzOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWRLaXQ8VD59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0ID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgaW5pdCxcbiAgICBmYWNldHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PlxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbiAgICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgICAgaW5pdCxcbiAgICAgIGZhY2V0cyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge00gJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgc2VsZjogUmVtb3RhYmxlT2JqZWN0ICYgTTtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPE0+fVxuICovXG4gIGNvbnN0IHByZXBhcmVFeG8gPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIGNvbnN0IG1ha2VTaW5nbGV0b24gPSBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgICBiYWdnYWdlLFxuICAgICAga2luZE5hbWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXRFbXB0eSxcbiAgICAgIG1ldGhvZHMsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG5cbiAgICByZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fc2luZ2xldG9uYCwgKCkgPT4gbWFrZVNpbmdsZXRvbigpKTtcbiAgfTtcbiAgaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4gIC8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG8gaW5zdGVhZC5cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7R3VhcmRlZDxNPn1cbiAqL1xuICBjb25zdCBwcmVwYXJlU2luZ2xldG9uID0gKGJhZ2dhZ2UsIGtpbmROYW1lLCBtZXRob2RzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PlxuICAgIHByZXBhcmVFeG8oYmFnZ2FnZSwga2luZE5hbWUsIHVuZGVmaW5lZCwgbWV0aG9kcywgb3B0aW9ucyk7XG4gIGhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gICAgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gICAgcHJlcGFyZUV4b0NsYXNzLFxuICAgIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvLFxuXG4gICAgcHJlcGFyZVNpbmdsZXRvbixcbiAgICBwcm92aWRlS2luZEhhbmRsZSxcbiAgICBwcmVwYXJlS2luZCxcbiAgICBwcmVwYXJlS2luZE11bHRpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscyA9IG1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuICAgICAgIGNvbnN0IHtcbiAgZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvQ2xhc3MsXG4gIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgcHJlcGFyZUV4byxcbiAgcHJlcGFyZVNpbmdsZXRvbixcbn0gPSBnbG9iYWxFeG9VdGlscztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqLyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MoZGVmaW5lVmlydHVhbEV4b0NsYXNzKTskaM2PX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzKHByZXBhcmVFeG9DbGFzcyk7JGjNj19vbmNlLnByZXBhcmVFeG9DbGFzc0tpdChwcmVwYXJlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pOyRozY9fb25jZS5wcmVwYXJlU2luZ2xldG9uKHByZXBhcmVTaW5nbGV0b24pO1xuICAgICAgIGNvbnN0IHsgcHJvdmlkZUtpbmRIYW5kbGUsIHByZXBhcmVLaW5kLCBwcmVwYXJlS2luZE11bHRpIH0gPVxuICBnbG9iYWxFeG9VdGlsczskaM2PX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRozY9fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjNj19vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPnOvptggAALYIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiLi9leG8tdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbXV0sW1wiLi9leG8tdXRpbHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL3N0b3JlIjpbWyJNIiwiTSJdLFsibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyI6W1sibWFrZUtpbmRIYW5kbGUiLCJtYWtlS2luZEhhbmRsZSJdLFsicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sWyJ3YXRjaFByb21pc2UiLCJ3YXRjaFByb21pc2UiXSxbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSxbImNhbkJlRHVyYWJsZSIsImNhbkJlRHVyYWJsZSJdLFsicGlja0ZhY2V0IiwicGlja0ZhY2V0Il0sWyJwYXJ0aWFsQXNzaWduIiwicGFydGlhbEFzc2lnbiJdLFsicHJvdmlkZSIsInByb3ZpZGUiXSxbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdLFsiZGVmaW5lS2luZCIsImRlZmluZUtpbmQiXSxbImRlZmluZUtpbmRNdWx0aSIsImRlZmluZUtpbmRNdWx0aSJdLFsiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZCJdLFsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXV0sIi4vZXhvLXV0aWxzLmpzIjpbWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSxbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzcyJdLFsicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvIiwicHJlcGFyZUV4byJdLFsicHJlcGFyZVNpbmdsZXRvbiIsInByZXBhcmVTaW5nbGV0b24iXSxbImlnbm9yZUNvbnRleHQiLCJpZ25vcmVDb250ZXh0Il0sWyJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVLaW5kSGFuZGxlIl0sWyJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kIl0sWyJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZUtpbmRNdWx0aSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA73e+MDkjAAA5IwAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiVmF0RGF0YSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJtYWtlS2luZEhhbmRsZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVN0b3JlVXRpbHMiLCJwYXJ0aWFsQXNzaWduIiwicGlja0ZhY2V0IiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscHJvdmlkZUxhenk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtCYWdnYWdlLCBQaWNrRmFjZXQsIFZhdERhdGF9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJyAqL1xuXG4vKiogQHR5cGUge1ZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmICgnVmF0RGF0YScgaW4gZ2xvYmFsVGhpcykge1xuICBnbG9iYWxUaGlzLlZhdERhdGEgfHwgRmFpbGBWYXREYXRhIGRlZmluZWQgaW4gZ2xvYmFsIGFzIG51bGwgb3IgdW5kZWZpbmVkYDtcbiAgLyogWFhYIHR5cGVzIGluY29tcGF0aWJpbGl0eSovXG4gIFZhdERhdGFHbG9iYWwgPSAvKiogQHR5cGUge2FueX0gKi8gKGdsb2JhbFRoaXMuVmF0RGF0YSk7XG59IGVsc2Uge1xuICAvKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuICAvKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbiAgLyogZmFpbCBhdCBydW50aW1lLiovXG4gIGNvbnN0IHVuYXZhaWxhYmxlID0gKCkgPT4gRmFpbGBWYXREYXRhIHVuYXZhaWxhYmxlYDtcbiAgVmF0RGF0YUdsb2JhbCA9IHtcbiAgICBkZWZpbmVLaW5kOiB1bmF2YWlsYWJsZSxcbiAgICBkZWZpbmVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kOiB1bmF2YWlsYWJsZSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlS2luZEhhbmRsZTogdW5hdmFpbGFibGUsXG4gICAgcHJvdmlkZVByb21pc2VXYXRjaGVyOiB1bmF2YWlsYWJsZSxcbiAgICB3YXRjaFByb21pc2U6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBjYW5CZUR1cmFibGU6IHVuYXZhaWxhYmxlLFxuICB9O1xufVxuXG5jb25zdCBWYXREYXRhRXhwb3J0ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovXG4gICAgICAgY29uc3Qge1xuICBkZWZpbmVLaW5kLFxuICBkZWZpbmVLaW5kTXVsdGksXG4gIGRlZmluZUR1cmFibGVLaW5kLFxuICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxufSA9IFZhdERhdGFHbG9iYWw7JGjNj19vbmNlLmRlZmluZUtpbmQoZGVmaW5lS2luZCk7JGjNj19vbmNlLmRlZmluZUtpbmRNdWx0aShkZWZpbmVLaW5kTXVsdGkpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVLaW5kTXVsdGkoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSk7XG5cbiAgICAgICBjb25zdCB7XG4gIG1ha2VLaW5kSGFuZGxlLFxuICBwcm92aWRlUHJvbWlzZVdhdGNoZXIsXG4gIHdhdGNoUHJvbWlzZSxcbiAgbWFrZVNjYWxhckJpZ01hcFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG4gIGNhbkJlRHVyYWJsZSxcbn0gPSBWYXREYXRhR2xvYmFsO1xuXG4vKipcbiAqIFdoZW4gbWFraW5nIGEgbXVsdGktZmFjZXQga2luZCwgaXQncyBjb21tb24gdG8gcGljayBvbmUgZmFjZXQgdG8gZXhwb3NlLlxuICogRS5nLixcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IChhLCBiLCBjLCBkKSA9PiBtYWtlRm9vQmFzZShhLCBiLCBjLCBkKS5zZWxmO1xuICpcbiAqIFRoaXMgaGVscGVyIHJlZHVjZXMgdGhlIGR1cGxpY2F0aW9uOlxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gcGlja0ZhY2V0KG1ha2VGb29CYXNlLCAnc2VsZicpO1xuICpcbiAqIEB0eXBlIHtQaWNrRmFjZXR9XG4gKi8kaM2PX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRozY9fb25jZS5wcm92aWRlUHJvbWlzZVdhdGNoZXIocHJvdmlkZVByb21pc2VXYXRjaGVyKTskaM2PX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaM2PX29uY2UuY2FuQmVEdXJhYmxlKGNhbkJlRHVyYWJsZSk7XG4gICAgICAgY29uc3QgcGlja0ZhY2V0ID1cbiAgKG1ha2VyLCBmYWNldE5hbWUpID0+XG4gICguLi5hcmdzKSA9PlxuICAgIG1ha2VyKC4uLmFyZ3MpW2ZhY2V0TmFtZV07JGjNj19vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbiAgICAgICBjb25zdCBwYXJ0aWFsQXNzaWduID0gKHRhcmdldCwgc291cmNlKSA9PiB7XG4gIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpO1xufTskaM2PX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyoqIEBpbXBvcnQge1N0b3JlT3B0aW9uc30gZnJvbSAnQGFnb3JpYy9zdG9yZScgKi9cblxuLyoqXG4gKiBVbmxpa2UgYHByb3ZpZGVMYXp5YCwgYHByb3ZpZGVgIHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHdpdGhpbiBhbnkgdmF0XG4gKiBpbmNhcm5hdGlvbiB3aXRoIGEgZ2l2ZW4gYGJhZ2dhZ2VgLGBrZXlgIHBhaXIuXG4gKlxuICogYHByb3ZpZGVgIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gcG9wdWxhdGUgYmFnZ2FnZSwgd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZlxuICogY2FsbHMgdG8gYHByb3ZpZGVgIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0b1xuICogZGV0ZWN0IGNvbGxpc2lvbnMgaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyXG4gKiBiYWdnYWdlLW9yaWVudGVkIGBwcm92aWRlKmAgYW5kIGBwcmVwYXJlKmAgZnVuY3Rpb25zIGNhbGwgYHByb3ZpZGVgLCBhbmQgc29cbiAqIGltcG9zZSB0aGUgc2FtZSBjb25zdHJhaW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHlcbiAqIHBhdHRlcm5zOiBXaGF0IHdlIHN0b3JlIGluIGJhZ2dhZ2UgYXJlXG4gKlxuICogLSBraW5kSGFuZGxlcywgd2hpY2ggYXJlIHBlciBraW5kLCB3aGljaCBtdXN0IGJlIGxvdyBjYXJkaW5hbGl0eVxuICogLSBkYXRhIFwidmFyaWFibGVzXCIgZm9yIHJlZXN0YWJsaXNoaW5nIHRoZSBsZXhpY2FsIHNjb3BlLCBlc3BlY2lhbGx5IG9mXG4gKiAgIHNpbmdsZXRvbnNcbiAqIC0gbmFtZWQgbm9uLWJhZ2dhZ2UgY29sbGVjdGlvbnMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgYmFnZ2FnZSB0cmVlLlxuICpcbiAqIFdoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaGlnaCBjYXJkaW5hbGl0eSBhcmUgdGhlIGluc3RhbmNlcyBvZiB0aGUga2luZHMsIGFuZFxuICogdGhlIG1lbWJlcnMgb2YgdGhlIG5vbi1iYWdnZ2FnZSBjb2xsZWN0aW9ucy5cbiAqXG4gKiBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU4NzUgOiBJbXBsZW1lbnRcbiAqIGRldmVsb3BtZW50LXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGRldGVjdCB3aGVuIGBwcm92aWRlYCB2aW9sYXRlcyB0aGUgYWJvdmVcbiAqIHByZXNjcmlwdGlvbiwgYW5kIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB2YXQgaW5jYXJuYXRpb24gd2l0aFxuICogdGhlIHNhbWUgYmFnZ2FnZSxrZXkgcGFpci5cbiAqL1xuXG4gICAgICAgY29uc3QgcHJvdmlkZSA9XG4gIC8qIFhYWCBjYXN0IGJlY2F1c2UgcHJvdmlkZUxhenkgaXMgYGFueWAgZHVlIHRvIGJyb2tlbiB0eXBlIGltcG9ydCovXG4gIC8qKlxuICogQHR5cGUgezxLLCBWPihcbiAqICAgYmFnZ2FnZTogQmFnZ2FnZSxcbiAqICAga2V5OiBLLFxuICogICBtYWtlVmFsdWU6IChrZXk6IEspID0+IFYsXG4gKiApID0+IFZ9XG4gKi8gICAocHJvdmlkZUxhenkpO1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbi8qKiBAcGFyYW0ge1ZhdERhdGF9IFZhdERhdGEgKi8kaM2PX29uY2UucHJvdmlkZShwcm92aWRlKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVVdGlscyA9IFZhdERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG4gICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlLFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgfSA9IFZhdERhdGE7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVNldFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTdG9yZVV0aWxzKG1ha2VTdG9yZVV0aWxzKTtcblxuY29uc3QgZ2xvYmFsU3RvcmVVdGlscyA9IG1ha2VTdG9yZVV0aWxzKFZhdERhdGFHbG9iYWwpO1xuICAgICAgIGNvbnN0IHtcbiAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG4gIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLFxufSA9IGdsb2JhbFN0b3JlVXRpbHM7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVTZXRTdG9yZShwcm92aWRlRHVyYWJsZVNldFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFe/gZrAgAAKwIAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvbWFrZUhhbmRsZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2Vycm9ycyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVIYW5kbGUiLCJtYWtlSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW5pdEVtcHR5LG1ha2VFeG8scHJlcGFyZUV4b0NsYXNzLEZhaWwsSGFuZGxlSTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXSxbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkhhbmRsZUlcIixbJGjNj19hID0+IChIYW5kbGVJID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge0hhbmRsZSwgSW5zdGFuY2V9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBIXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7SH0gaGFuZGxlVHlwZVxuICogQHJldHVybnMge0ggZXh0ZW5kcyAnSW5zdGFuY2UnID8gKCkgPT4gSW5zdGFuY2UgOiAoKSA9PiBIYW5kbGU8SD59XG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVEdXJhYmxlSGFuZGxlID0gKGJhZ2dhZ2UsIGhhbmRsZVR5cGUpID0+IHtcbiAgdHlwZW9mIGhhbmRsZVR5cGUgPT09ICdzdHJpbmcnIHx8IEZhaWxgaGFuZGxlVHlwZSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgY29uc3QgbWFrZUhhbmRsZSA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICBiYWdnYWdlLFxuICAgIGAke2hhbmRsZVR5cGV9SGFuZGxlYCxcbiAgICBIYW5kbGVJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7fSxcbiAgKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBCaXQgYnkgb3VyIG93biBvcGFxdWUgdHlwZXMuKi9cbiAgcmV0dXJuIC8qKiBAdHlwZSB7KCkgPT4gSGFuZGxlPEg+fSAqLyAobWFrZUhhbmRsZSk7XG59OyRozY9fb25jZS5kZWZpbmVEdXJhYmxlSGFuZGxlKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuaGFyZGVuKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBvcGFxdWUgaGFuZGxlIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlIHRoZSBzdHJpbmcgbGl0ZXJhbCB0eXBlIG9mIHRoZSBoYW5kbGVcbiAqIEByZXR1cm5zIHtIIGV4dGVuZHMgJ0luc3RhbmNlJyA/IEluc3RhbmNlIDogSGFuZGxlPEg+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUhhbmRsZSA9IGhhbmRsZVR5cGUgPT4ge1xuICB0eXBlb2YgaGFuZGxlVHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuICAvKiBSZXR1cm4gdGhlIGludGVyc2VjdGlvbiB0eXBlIChyZWFsbHkganVzdCBhbiBlbXB0eSBvYmplY3QpLiovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgQml0IGJ5IG91ciBvd24gb3BhcXVlIHR5cGVzLiovXG4gIHJldHVybiAvKiogQHR5cGUge0hhbmRsZTxIPn0gKi8gKG1ha2VFeG8oYCR7aGFuZGxlVHlwZX1IYW5kbGVgLCBIYW5kbGVJLCB7fSkpO1xufTskaM2PX29uY2UubWFrZUhhbmRsZShtYWtlSGFuZGxlKTtcbmhhcmRlbihtYWtlSGFuZGxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUR1cmFibGVIYW5kbGUiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSJdLCJtYWtlSGFuZGxlIjpbIm1ha2VIYW5kbGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAdP0S0hLAABISwAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiXSwiZXhwb3J0cyI6WyJBZG1pbkZhY2V0SSIsIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSIsIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSIsIkJ1bmRsZUNhcFNoYXBlIiwiQnVuZGxlU2hhcGUiLCJFbXB0eVByb3Bvc2FsU2hhcGUiLCJFeGl0T2JqZWN0SSIsIkV4aXRPYmplY3RTaGFwZSIsIkZlZU1pbnRBY2Nlc3NTaGFwZSIsIkZ1bGxQcm9wb3NhbFNoYXBlIiwiSGFuZGxlSSIsIkhhbmRsZU9mZmVySSIsIkluc3RhbGxhdGlvblNoYXBlIiwiSW5zdGFuY2VBZG1pbkkiLCJJbnN0YW5jZUFkbWluU2hhcGUiLCJJbnN0YW5jZUhhbmRsZVNoYXBlIiwiSW5zdGFuY2VSZWNvcmRTaGFwZSIsIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IiwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSIsIkludml0YXRpb25IYW5kbGVTaGFwZSIsIkludml0YXRpb25TaGFwZSIsIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJSZWNvcmRTaGFwZSIsIktleXdvcmRTaGFwZSIsIk9mZmVySGFuZGxlckkiLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSIsIlByaWNlUXVvdGVTaGFwZSIsIlByb3Bvc2FsU2hhcGUiLCJTZWF0RGF0YVNoYXBlIiwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiLCJTZWF0U2hhcGUiLCJUZXJtc1NoYXBlIiwiVGltZXJTaGFwZSIsIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudFNoYXBlLEFzc2V0S2luZFNoYXBlLEJyYW5kU2hhcGUsRGlzcGxheUluZm9TaGFwZSxJc3N1ZXJLaXRTaGFwZSxJc3N1ZXJTaGFwZSxQYXltZW50U2hhcGUsU3Vic2NyaWJlclNoYXBlLE0sVGltZXN0YW1wU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIixbJGjNj19hID0+IChBc3NldEtpbmRTaGFwZSA9ICRozY9fYSldXSxbXCJCcmFuZFNoYXBlXCIsWyRozY9fYSA9PiAoQnJhbmRTaGFwZSA9ICRozY9fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsWyRozY9fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRozY9fYSldXSxbXCJJc3N1ZXJLaXRTaGFwZVwiLFskaM2PX2EgPT4gKElzc3VlcktpdFNoYXBlID0gJGjNj19hKV1dLFtcIklzc3VlclNoYXBlXCIsWyRozY9fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaM2PX2EpXV0sW1wiUGF5bWVudFNoYXBlXCIsWyRozY9fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsWyRozY9fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0FmdGVyRGVhZGxpbmVFeGl0UnVsZSwgSW5zdGFsbGF0aW9uLCBab2VJc3N1ZXJSZWNvcmR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0V4aXRSdWxlLCBJbnZpdGF0aW9uLCBJbnZpdGF0aW9uSGFuZGxlLCBXYWl2ZWRFeGl0UnVsZX0gZnJvbSAnLi90eXBlcy1pbmRleC5qcyc7XG4gKiBAaW1wb3J0IHtJbnZpdGF0aW9uRGV0YWlsc30gZnJvbSAnLi90eXBlcy1pbmRleC5qcyc7XG4gKi9cblxuLyoga2V5d29yZHMgaGF2ZSBhbiBpbml0aWFsIGNhcCovXG4gICAgICAgY29uc3QgS2V5d29yZFNoYXBlID0gTS5zdHJpbmcoKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbkhhbmRsZT59ICovJGjNj19vbmNlLktleXdvcmRTaGFwZShLZXl3b3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEludml0YXRpb25IYW5kbGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uSGFuZGxlJyk7XG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnZpdGF0aW9uPn0gKi8kaM2PX29uY2UuSW52aXRhdGlvbkhhbmRsZVNoYXBlKEludml0YXRpb25IYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW52aXRhdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTskaM2PX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VIYW5kbGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YW5jZUhhbmRsZScpO1xuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW5zdGFsbGF0aW9uPn0gKi8kaM2PX29uY2UuSW5zdGFuY2VIYW5kbGVTaGFwZShJbnN0YW5jZUhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YWxsYXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKTskaM2PX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IFNlYXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdTZWF0Jyk7JGjNj19vbmNlLlNlYXRTaGFwZShTZWF0U2hhcGUpO1xuXG4gICAgICAgY29uc3QgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIEFtb3VudFNoYXBlKTskaM2PX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKCksXG4pOyRozY9fb25jZS5BbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLmVyZWYoUGF5bWVudFNoYXBlKSxcbik7JGjNj19vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgSXNzdWVyU2hhcGUpOyRozY9fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLmVyZWYoSXNzdWVyU2hhcGUpLFxuKTskaM2PX29uY2UuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBCcmFuZFNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48Wm9lSXNzdWVyUmVjb3JkPn0gKi8kaM2PX29uY2UuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlclJlY29yZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGJyYW5kOiBCcmFuZFNoYXBlLFxuICAgIGlzc3VlcjogSXNzdWVyU2hhcGUsXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAgeyBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSB9LFxuKTskaM2PX29uY2UuSXNzdWVyUmVjb3JkU2hhcGUoSXNzdWVyUmVjb3JkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVGVybXNTaGFwZSA9IHtcbiAgaXNzdWVyczogSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuICBicmFuZHM6IEJyYW5kS2V5d29yZFJlY29yZFNoYXBlLFxufTskaM2PX29uY2UuVGVybXNTaGFwZShUZXJtc1NoYXBlKTtcbmhhcmRlbihUZXJtc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEluc3RhbmNlUmVjb3JkU2hhcGUgPSB7XG4gIGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUsXG4gIGluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICB0ZXJtczogTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSxcbn07JGjNj19vbmNlLkluc3RhbmNlUmVjb3JkU2hhcGUoSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5oYXJkZW4oSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBIYW5kbGVJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZScsIHt9KTskaM2PX29uY2UuSGFuZGxlSShIYW5kbGVJKTtcblxuICAgICAgIGNvbnN0IG1ha2VIYW5kbGVTaGFwZSA9IG5hbWUgPT4gTS5yZW1vdGFibGUoYCR7bmFtZX1IYW5kbGVgKTskaM2PX29uY2UubWFrZUhhbmRsZVNoYXBlKG1ha2VIYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXJTaGFwZSA9IG1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLyoqXG4gKiBBZnRlciBkZWZhdWx0cyBhcmUgZmlsbGVkIGluXG4gKlxuICogQHNlZSB7UHJvcG9zYWxSZWNvcmR9IHR5cGVcbiAqLyRozY9fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IEZ1bGxQcm9wb3NhbFNoYXBlID0ge1xuICB3YW50OiBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlLFxuICBnaXZlOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gIC8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5zcGxpdFJlY29yZCwqL1xuICAvKiBidXQgdGhlIGVycm9yIG1lc3NhZ2VzIHdvdWxkIGhhdmUgYmVlbiB3b3JzZS4gUmF0aGVyLCovXG4gIC8qIGNsZWFuUHJvcG9zYWwncyBhc3NlcnRFeGl0IGNoZWNrcyB0aGF0IHRoZXJlJ3MgZXhhY3RseSBvbmUuKi9cbiAgZXhpdDogTS5zcGxpdFJlY29yZChcbiAgICB7fSxcbiAgICB7XG4gICAgICBvbkRlbWFuZDogbnVsbCxcbiAgICAgIHdhaXZlZDogbnVsbCxcbiAgICAgIGFmdGVyRGVhZGxpbmU6IHtcbiAgICAgICAgdGltZXI6IE0uZXJlZihUaW1lclNoYXBlKSxcbiAgICAgICAgZGVhZGxpbmU6IFRpbWVzdGFtcFNoYXBlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHt9LFxuICApLFxufTskaM2PX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuaGFyZGVuKEZ1bGxQcm9wb3NhbFNoYXBlKTtcblxuLyoqIEBzZWUge1Byb3Bvc2FsfSB0eXBlICovXG4gICAgICAgY29uc3QgUHJvcG9zYWxTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe30sIEZ1bGxQcm9wb3NhbFNoYXBlLCB7fSk7JGjNj19vbmNlLlByb3Bvc2FsU2hhcGUoUHJvcG9zYWxTaGFwZSk7XG5cbiAgICAgICBjb25zdCBFbXB0eVByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHtcbiAgZ2l2ZToge30sXG4gIHdhbnQ6IHt9LFxuICBleGl0OiB7IG9uRGVtYW5kOiBudWxsIH0sXG59KTskaM2PX29uY2UuRW1wdHlQcm9wb3NhbFNoYXBlKEVtcHR5UHJvcG9zYWxTaGFwZSk7XG5cbiAgICAgICBjb25zdCBpc09uRGVtYW5kRXhpdFJ1bGUgPSBleGl0ID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnb25EZW1hbmQnO1xufTskaM2PX29uY2UuaXNPbkRlbWFuZEV4aXRSdWxlKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5oYXJkZW4oaXNPbkRlbWFuZEV4aXRSdWxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBXYWl2ZWRFeGl0UnVsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzV2FpdmVkRXhpdFJ1bGUgPSBleGl0ID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnd2FpdmVkJztcbn07JGjNj19vbmNlLmlzV2FpdmVkRXhpdFJ1bGUoaXNXYWl2ZWRFeGl0UnVsZSk7XG5oYXJkZW4oaXNXYWl2ZWRFeGl0UnVsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfVxuICovXG4gICAgICAgY29uc3QgaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUgPSBleGl0ID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnYWZ0ZXJEZWFkbGluZSc7XG59OyRozY9fb25jZS5pc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5oYXJkZW4oaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnZpdGF0aW9uRGV0YWlscz59ICovXG4gICAgICAgY29uc3QgSW52aXRhdGlvbkVsZW1lbnRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe1xuICBkZXNjcmlwdGlvbjogTS5zdHJpbmcoKSxcbiAgaGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlU2hhcGUsXG4gIGluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlLFxufSk7JGjNj19vbmNlLkludml0YXRpb25FbGVtZW50U2hhcGUoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckhhbmRsZXJJID0gTS5pbnRlcmZhY2UoJ09mZmVySGFuZGxlcicsIHtcbiAgaGFuZGxlOiBNLmNhbGwoU2VhdFNoYXBlKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpLFxufSk7JGjNj19vbmNlLk9mZmVySGFuZGxlckkoT2ZmZXJIYW5kbGVySSk7XG5cbiAgICAgICBjb25zdCBTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSA9IE0uYXJyYXlPZih7XG4gIHNlYXRIYW5kbGU6IFNlYXRTaGFwZSxcbiAgYWxsb2NhdGlvbjogQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxufSk7JGjNj19vbmNlLlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFpvZU1pbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdab2VNaW50Jyk7JGjNj19vbmNlLlpvZU1pbnRTaGFwZShab2VNaW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFpvZU1pbnRJID0gTS5pbnRlcmZhY2UoJ1pvZU1pbnQnLCB7XG4gIGdldElzc3VlclJlY29yZDogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG4gIG1pbnRBbmRFc2Nyb3c6IE0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxuICB3aXRoZHJhd0FuZEJ1cm46IE0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLlpvZU1pbnRJKFpvZU1pbnRJKTtcblxuICAgICAgIGNvbnN0IEZlZU1pbnRBY2Nlc3NTaGFwZSA9IE0ucmVtb3RhYmxlKCdGZWVNaW50QWNjZXNzJyk7JGjNj19vbmNlLkZlZU1pbnRBY2Nlc3NTaGFwZShGZWVNaW50QWNjZXNzU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRXhpdE9iamVjdEkgPSBNLmludGVyZmFjZSgnRXhpdCBPYmplY3QnLCB7XG4gIGV4aXQ6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5FeGl0T2JqZWN0SShFeGl0T2JqZWN0SSk7XG5cbiAgICAgICBjb25zdCBFeGl0T2JqZWN0U2hhcGUgPSBNLnJlbW90YWJsZSgnRXhpdE9iaicpOyRozY9fb25jZS5FeGl0T2JqZWN0U2hhcGUoRXhpdE9iamVjdFNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YW5jZUFkbWluU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpOyRozY9fb25jZS5JbnN0YW5jZUFkbWluU2hhcGUoSW5zdGFuY2VBZG1pblNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YW5jZUFkbWluSSA9IE0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluJywge1xuICBtYWtlSW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgTS5zdHJpbmcoKSlcbiAgICAub3B0aW9uYWwoTS5yZWNvcmQoKSwgTS5wYXR0ZXJuKCkpXG4gICAgLnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbiAgc2F2ZUlzc3VlcjogTS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSwgS2V5d29yZFNoYXBlKS5yZXR1cm5zKFxuICAgIElzc3VlclJlY29yZFNoYXBlLFxuICApLFxuICBtYWtlTm9Fc2Nyb3dTZWF0OiBNLmNhbGwoXG4gICAgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAgIFByb3Bvc2FsU2hhcGUsXG4gICAgRXhpdE9iamVjdFNoYXBlLFxuICAgIFNlYXRTaGFwZSxcbiAgKS5yZXR1cm5zKFNlYXRTaGFwZSksXG4gIGV4aXRBbGxTZWF0czogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbEFsbFNlYXRzOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBleGl0U2VhdDogTS5jYWxsKFNlYXRTaGFwZSwgTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsU2VhdDogTS5jYWxsKFNlYXRTaGFwZSwgTS5hbnkoKSkucmV0dXJucygpLFxuICBtYWtlWm9lTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSlcbiAgICAub3B0aW9uYWwoXG4gICAgICBBc3NldEtpbmRTaGFwZSxcbiAgICAgIERpc3BsYXlJbmZvU2hhcGUsXG4gICAgICBNLnNwbGl0UmVjb3JkKHt9LCB7IGVsZW1lbnRTaGFwZTogTS5wYXR0ZXJuKCkgfSksXG4gICAgKVxuICAgIC5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxuICByZWdpc3RlckZlZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUsIEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnZmVlTWludCcpLFxuICApLFxuICByZXBsYWNlQWxsb2NhdGlvbnM6IE0uY2FsbChTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSkucmV0dXJucygpLFxuICBzdG9wQWNjZXB0aW5nT2ZmZXJzOiBNLmNhbGwoKS5yZXR1cm5zKCksXG4gIHNldE9mZmVyRmlsdGVyOiBNLmNhbGwoTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5yZXR1cm5zKCksXG4gIGdldE9mZmVyRmlsdGVyOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gIGdldEV4aXRTdWJzY3JpYmVyOiBNLmNhbGwoU2VhdFNoYXBlKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4gIGlzQmxvY2tlZDogTS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICByZXBhaXJDb250cmFjdENvbXBsZXRpb25XYXRjaGVyOiBNLmNhbGwoKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuSW5zdGFuY2VBZG1pbkkoSW5zdGFuY2VBZG1pbkkpO1xuXG4gICAgICAgY29uc3QgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQgPSB7XG4gIGluc3RhbmNlU3RvcmFnZU1hbmFnZXI6IE0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyJywge1xuICAgIGdldFRlcm1zOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuICAgIGdldElzc3VlcnM6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRCcmFuZHM6IE0uY2FsbCgpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKCkucmV0dXJucyhJbnN0YWxsYXRpb25TaGFwZSksXG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbiAgICBzYXZlSXNzdWVyOiBNLmNhbGwoSXNzdWVyU2hhcGUsIEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgbWFrZVpvZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUpXG4gICAgICAub3B0aW9uYWwoXG4gICAgICAgIEFzc2V0S2luZFNoYXBlLFxuICAgICAgICBEaXNwbGF5SW5mb1NoYXBlLFxuICAgICAgICBNLnNwbGl0UmVjb3JkKHt9LCB7IGVsZW1lbnRTaGFwZTogTS5wYXR0ZXJuKCkgfSksXG4gICAgICApXG4gICAgICAucmV0dXJucyhNLmVyZWYoWm9lTWludFNoYXBlKSksXG4gICAgcmVnaXN0ZXJGZWVNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlLCBGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnJlbW90YWJsZSgnZmVlTWludCcpLFxuICAgICksXG4gICAgZ2V0SW5zdGFuY2VSZWNvcmQ6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VSZWNvcmRTaGFwZSksXG4gICAgZ2V0SXNzdWVyUmVjb3JkczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbiAgICBnZXRXaXRoZHJhd0ZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdXaXRoZHJhd0ZhY2V0JykpLFxuICAgIGluaXRJbnN0YW5jZUFkbWluOiBNLmNhbGwoXG4gICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgICAgTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGRlbGV0ZUluc3RhbmNlQWRtaW46IE0uY2FsbChJbnN0YW5jZUFkbWluU2hhcGUpLnJldHVybnMoKSxcbiAgICBtYWtlSW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgTS5zdHJpbmcoKSlcbiAgICAgIC5vcHRpb25hbChNLnJlY29yZCgpLCBNLnBhdHRlcm4oKSlcbiAgICAgIC5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gICAgZ2V0Um9vdDogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbiAgICBnZXRBZG1pbk5vZGU6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKSxcbiAgfSksXG4gIHdpdGhkcmF3RmFjZXQ6IE0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jywge1xuICAgIHdpdGhkcmF3UGF5bWVudHM6IE0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG4gICAgICBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICApLFxuICB9KSxcbiAgaGVscGVyczogTS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXIgaGVscGVyJywge1xuICAgIHdyYXBJc3N1ZXJLaXRXaXRoWm9lTWludDogTS5jYWxsKFxuICAgICAgS2V5d29yZFNoYXBlLFxuICAgICAgSXNzdWVyS2l0U2hhcGUsXG4gICAgICBNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJyksXG4gICAgKS5yZXR1cm5zKFpvZU1pbnRTaGFwZSksXG4gIH0pLFxufTskaM2PX29uY2UuSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuaGFyZGVuKEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuICAgICAgIGNvbnN0IEJ1bmRsZUNhcFNoYXBlID0gTS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRozY9fb25jZS5CdW5kbGVDYXBTaGFwZShCdW5kbGVDYXBTaGFwZSk7XG4gICAgICAgY29uc3QgQnVuZGxlU2hhcGUgPSBNLmFuZChcbiAgTS5zcGxpdFJlY29yZCh7IG1vZHVsZUZvcm1hdDogTS5hbnkoKSB9KSxcbiAgTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLnN0cmluZyh7IHN0cmluZ0xlbmd0aExpbWl0OiBJbmZpbml0eSB9KSksXG4pOyRozY9fb25jZS5CdW5kbGVTaGFwZShCdW5kbGVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHsgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSB9LFxuICB7XG4gICAgYnVuZGxlOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uc3RyaW5nKHsgc3RyaW5nTGVuZ3RoTGltaXQ6IEluZmluaXR5IH0pKSxcbiAgICBidW5kbGVDYXA6IEJ1bmRsZUNhcFNoYXBlLFxuICAgIGJ1bmRsZUlEOiBNLnN0cmluZygpLFxuICB9LFxuICB7fSxcbik7JGjNj19vbmNlLlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCA9IHtcbiAgem9lU2VydmljZURhdGFBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLCB7XG4gICAgZ2V0VGVybXM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuICAgIGdldElzc3VlcnM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0QnJhbmRzOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpLFxuICAgICksXG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbiAgICBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246IE0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbiAgICAgIE0uZXJlZihNLnN0cmluZygpKSxcbiAgICApLFxuICAgIGluc3RhbGxCdW5kbGU6IE0uY2FsbChCdW5kbGVTaGFwZSlcbiAgICAgIC5vcHRpb25hbChNLnN0cmluZygpKVxuICAgICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGluc3RhbGxCdW5kbGVJRDogTS5jYWxsKE0uc3RyaW5nKCkpXG4gICAgICAub3B0aW9uYWwoTS5zdHJpbmcoKSlcbiAgICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuICAgIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0uZXJlZihNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSksXG4gICAgKSxcbiAgICBnZXRPZmZlckZpbHRlcjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbiAgICBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ub3B0KE0ucGF0dGVybigpKSxcbiAgICApLFxuICB9KSxcbiAgbWFrZU9mZmVyQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBtYWtlT2ZmZXIgYWNjZXNzJywge1xuICAgIGdldEFzc2V0S2luZEJ5QnJhbmQ6IE0uY2FsbChCcmFuZFNoYXBlKS5yZXR1cm5zKEFzc2V0S2luZFNoYXBlKSxcbiAgICBnZXRJbnN0YW5jZUFkbWluOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJyksXG4gICAgKSxcbiAgICBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ub3B0KE0ucGF0dGVybigpKSxcbiAgICApLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuICAgIGRlcG9zaXRQYXltZW50czogTS5jYWxsKFByb3Bvc2FsU2hhcGUsIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5wcm9taXNlKCksXG4gICAgKSxcbiAgfSksXG4gIHN0YXJ0SW5zdGFuY2VBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIHN0YXJ0SW5zdGFuY2UgYWNjZXNzJywge1xuICAgIG1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOiBNLmNhbGwoXG4gICAgICBJbnN0YWxsYXRpb25TaGFwZSxcbiAgICAgIE0uYW55KCksXG4gICAgICBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLFxuICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgICAgIE0ub3IoQnVuZGxlQ2FwU2hhcGUsIEJ1bmRsZVNoYXBlKSxcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB1bndyYXBJbnN0YWxsYXRpb246IE0uY2FsbFdoZW4oTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcbiAgICAgIFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlLFxuICAgICksXG4gIH0pLFxuICBpbnZpdGF0aW9uSXNzdWVyQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBpbnZpdGF0aW9uSXNzdWVyJywge1xuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuICB9KSxcbn07JGjNj19vbmNlLlpvZVN0b3JhZ2VNYW5hZ2VySUtpdChab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuaGFyZGVuKFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cbiAgICAgICBjb25zdCBab2VTZXJ2aWNlSSA9IE0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlJywge1xuICBpbnN0YWxsOiBNLmNhbGwoTS5hbnkoKSkub3B0aW9uYWwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGluc3RhbGxCdW5kbGVJRDogTS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBzdGFydEluc3RhbmNlOiBNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSwgTS5yZWNvcmQoKSwgTS5yZWNvcmQoKSwgTS5zdHJpbmcoKSlcbiAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG4gIG9mZmVyOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpXG4gICAgLm9wdGlvbmFsKFByb3Bvc2FsU2hhcGUsIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLCBNLmFueSgpKVxuICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuICBnZXRPZmZlckZpbHRlcjogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uYXJyYXlPZihNLnN0cmluZygpKSxcbiAgKSxcbiAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldEZlZUlzc3VlcjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldEJyYW5kczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIEJyYW5kS2V5d29yZFJlY29yZFNoYXBlLFxuICApLFxuICBnZXRJc3N1ZXJzOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuICApLFxuICBnZXRQdWJsaWNGYWNldDogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpLFxuICApLFxuICBnZXRUZXJtczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuICBnZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZTogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpLFxuICApLFxuICBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG4gICAgTS5lcmVmKE0uc3RyaW5nKCkpLFxuICApLFxuXG4gIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldENvbmZpZ3VyYXRpb246IE0uY2FsbCgpLnJldHVybnMoe1xuICAgIGZlZUlzc3VlckNvbmZpZzoge1xuICAgICAgbmFtZTogTS5zdHJpbmcoKSxcbiAgICAgIGFzc2V0S2luZDogJ25hdCcsXG4gICAgICBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSxcbiAgICB9LFxuICB9KSxcbiAgZ2V0SW52aXRhdGlvbkRldGFpbHM6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbiAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICApLFxufSk7JGjNj19vbmNlLlpvZVNlcnZpY2VJKFpvZVNlcnZpY2VJKTtcblxuICAgICAgIGNvbnN0IEFkbWluRmFjZXRJID0gTS5pbnRlcmZhY2UoJ1pjZkFkbWluRmFjZXQnLCB7XG4gIGdldFZhdFNodXRkb3duUHJvbWlzZTogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHJlc3RhcnRDb250cmFjdDogTS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHVwZ3JhZGVDb250cmFjdDogTS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICB0ZXJtaW5hdGVDb250cmFjdDogTS5jYWxsKE0uZXJyb3IoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG59KTskaM2PX29uY2UuQWRtaW5GYWNldEkoQWRtaW5GYWNldEkpO1xuXG4gICAgICAgY29uc3QgU2VhdERhdGFTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBwcm9wb3NhbDogUHJvcG9zYWxTaGFwZSxcbiAgICBpbml0aWFsQWxsb2NhdGlvbjogQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAgIHNlYXRIYW5kbGU6IFNlYXRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9mZmVyQXJnczogTS5hbnkoKSxcbiAgfSxcbik7JGjNj19vbmNlLlNlYXREYXRhU2hhcGUoU2VhdERhdGFTaGFwZSk7XG5cbiAgICAgICBjb25zdCBIYW5kbGVPZmZlckkgPSBNLmludGVyZmFjZSgnSGFuZGxlT2ZmZXInLCB7XG4gIGhhbmRsZU9mZmVyOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBTZWF0RGF0YVNoYXBlKS5yZXR1cm5zKHtcbiAgICBvZmZlclJlc3VsdFByb21pc2U6IE0ucHJvbWlzZSgpLFxuICAgIGV4aXRPYmo6IEV4aXRPYmplY3RTaGFwZSxcbiAgfSksXG59KTskaM2PX29uY2UuSGFuZGxlT2ZmZXJJKEhhbmRsZU9mZmVySSk7XG5cbiAgICAgICBjb25zdCBQcmljZVF1b3RlU2hhcGUgPSB7XG4gIHF1b3RlQW1vdW50OiBBbW91bnRTaGFwZSxcbiAgcXVvdGVQYXltZW50OiBNLmVyZWYoUGF5bWVudFNoYXBlKSxcbn07JGjNj19vbmNlLlByaWNlUXVvdGVTaGFwZShQcmljZVF1b3RlU2hhcGUpO1xuaGFyZGVuKFByaWNlUXVvdGVTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiRW1wdHlQcm9wb3NhbFNoYXBlIjpbIkVtcHR5UHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiRmVlTWludEFjY2Vzc1NoYXBlIjpbIkZlZU1pbnRBY2Nlc3NTaGFwZSJdLCJFeGl0T2JqZWN0SSI6WyJFeGl0T2JqZWN0SSJdLCJFeGl0T2JqZWN0U2hhcGUiOlsiRXhpdE9iamVjdFNoYXBlIl0sIkluc3RhbmNlQWRtaW5TaGFwZSI6WyJJbnN0YW5jZUFkbWluU2hhcGUiXSwiSW5zdGFuY2VBZG1pbkkiOlsiSW5zdGFuY2VBZG1pbkkiXSwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiQnVuZGxlQ2FwU2hhcGUiOlsiQnVuZGxlQ2FwU2hhcGUiXSwiQnVuZGxlU2hhcGUiOlsiQnVuZGxlU2hhcGUiXSwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiOlsiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiXSwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IjpbIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJab2VTZXJ2aWNlSSI6WyJab2VTZXJ2aWNlSSJdLCJBZG1pbkZhY2V0SSI6WyJBZG1pbkZhY2V0SSJdLCJTZWF0RGF0YVNoYXBlIjpbIlNlYXREYXRhU2hhcGUiXSwiSGFuZGxlT2ZmZXJJIjpbIkhhbmRsZU9mZmVySSJdLCJQcmljZVF1b3RlU2hhcGUiOlsiUHJpY2VRdW90ZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAABAYWdvcmljL3pvbmUtdjAuMi4yL2R1cmFibGUuanN7ImltcG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZHVyYWJsZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACAMlLK2hMAANoTAAAiAAAAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvYmFzZS16b25lIl0sImV4cG9ydHMiOlsibWFrZUR1cmFibGVab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxGYXIsaXNQYXNzYWJsZSxjYW5CZUR1cmFibGUsbWFrZVNjYWxhck1hcFN0b3JlLHByZXBhcmVFeG8scHJlcGFyZUV4b0NsYXNzLHByZXBhcmVFeG9DbGFzc0tpdCxwcm92aWRlRHVyYWJsZU1hcFN0b3JlLHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUscHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsd2F0Y2hQcm9taXNlLGtleXMsbWFrZU9uY2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsWyRozY9fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlU2V0U3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJ3YXRjaFByb21pc2VcIixbJGjNj19hID0+ICh3YXRjaFByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZVwiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIixbJGjNj19hID0+IChrZXlzID0gJGjNj19hKV1dLFtcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnLi9pbmRleC5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yZXN9IGZyb20gJy4vaW5kZXguanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICovXG5cbi8qKlxuICogQSB2YXJpYW50IG9mIGBjYW5CZUR1cmFibGVgIHRoYXQgcmV0dXJucyBgZmFsc2VgIGluc3RlYWQgb2YgZXZlciB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNTdG9yYWJsZSA9IHNwZWNpbWVuID0+IGlzUGFzc2FibGUoc3BlY2ltZW4pICYmIGNhbkJlRHVyYWJsZShzcGVjaW1lbik7XG5oYXJkZW4oaXNTdG9yYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHsoKSA9PiBCYWdnYWdlfSBnZXRCYWdnYWdlXG4gKi9cbmNvbnN0IGF0dGFjaER1cmFibGVTdG9yZXMgPSBnZXRCYWdnYWdlID0+IHtcbiAgLyoqIEB0eXBlIHtab25lWydtYXBTdG9yZSddfSAqL1xuICBjb25zdCBtYXBTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGJhZ2dhZ2UgPSBnZXRCYWdnYWdlKCk7XG4gICAgY29uc3QgcmV0ID0gcHJvdmlkZUR1cmFibGVNYXBTdG9yZShiYWdnYWdlLCBsYWJlbCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgLyoqIEB0eXBlIHtab25lWydzZXRTdG9yZSddfSAqL1xuICBjb25zdCBzZXRTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVNldFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuICAvKiogQHR5cGUge1pvbmVbJ3dlYWtTZXRTdG9yZSddfSAqL1xuICBjb25zdCB3ZWFrU2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnd2Vha01hcFN0b3JlJ119ICovXG4gIGNvbnN0IHdlYWtNYXBTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcblxuICAvKiogQHR5cGUge1N0b3Jlc30gKi9cbiAgcmV0dXJuIEZhcignZHVyYWJsZVN0b3JlcycsIHtcbiAgICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWREdXJhYmxlU3RvcmVzLFxuICAgIGlzU3RvcmFibGUsXG4gICAgbWFwU3RvcmUsXG4gICAgc2V0U3RvcmUsXG4gICAgd2Vha01hcFN0b3JlLFxuICAgIHdlYWtTZXRTdG9yZSxcbiAgfSk7XG59O1xuXG4vKiogQHR5cGUge1N0b3Jlc30gKi9cbmNvbnN0IGRldGFjaGVkRHVyYWJsZVN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT5cbiAgbWFrZVNjYWxhck1hcFN0b3JlKCdkZXRhY2hlZCcpLFxuKTtcblxuLyoqXG4gKiBDcmVhdGUgYSB6b25lIHdob3NlIG9iamVjdHMgcGVyc2lzdCBiZXR3ZWVuIEFnb3JpYyB2YXQgdXBncmFkZXMuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VMYWJlbF1cbiAqIEByZXR1cm5zIHtab25lfVxuICovXG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVab25lID0gKGJhZ2dhZ2UsIGJhc2VMYWJlbCA9ICdkdXJhYmxlWm9uZScpID0+IHtcbiAgYmFnZ2FnZSB8fCBGYWlsYGJhZ2dhZ2UgcmVxdWlyZWRgO1xuXG4gIGNvbnN0IGF0dGFjaGVkU3RvcmVzID0gYXR0YWNoRHVyYWJsZVN0b3JlcygoKSA9PiBiYWdnYWdlKTtcblxuICBjb25zdCB7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSA9IG1ha2VPbmNlS2l0KFxuICAgIGJhc2VMYWJlbCxcbiAgICBhdHRhY2hlZFN0b3JlcyxcbiAgICBiYWdnYWdlLFxuICApO1xuXG4gIC8qKiBAdHlwZSB7Wm9uZVsnZXhvQ2xhc3MnXX0gKi9cbiAgY29uc3QgZXhvQ2xhc3MgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzKGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiogQHR5cGUge1pvbmVbJ2V4b0NsYXNzS2l0J119ICovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgLS0gaGFwcGVucyBvbmx5IGludGVncmF0aW5nIHdpdGggRW5kbyBtYXN0ZXIqL1xuICAvKiBAdHMtaWdub3JlIEZJWE1FIGluIEVuZG8qL1xuICBjb25zdCBleG9DbGFzc0tpdCA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvQ2xhc3NLaXQoYmFnZ2FnZSwgLi4uYXJncyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnZXhvJ119ICovXG4gIGNvbnN0IGV4byA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvKGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuXG4gIGNvbnN0IHN1YlpvbmVTdG9yZSA9IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy56b25lKTtcblxuICAvKiogQHR5cGUge1pvbmVbJ3N1YlpvbmUnXX0gKi9cbiAgY29uc3Qgc3ViWm9uZSA9IChsYWJlbCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtCYWdnYWdlfSAqL1xuICAgIGNvbnN0IHN1YkJhZ2dhZ2UgPSBzdWJab25lU3RvcmUobGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtYWtlRHVyYWJsZVpvbmUoc3ViQmFnZ2FnZSwgYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ2R1cmFibGVab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKGV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmUsXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGF0dGFjaGVkU3RvcmVzLmRldGFjaGVkLFxuICAgIGlzU3RvcmFibGU6IGF0dGFjaGVkU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLnNldFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrTWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrTWFwU3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLndlYWtTZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUR1cmFibGVab25lKG1ha2VEdXJhYmxlWm9uZSk7XG5oYXJkZW4obWFrZUR1cmFibGVab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VEdXJhYmxlWm9uZSI6WyJtYWtlRHVyYWJsZVpvbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1jhUAsUBAADFAQAAHwAAAEBlbmRvL2NhY2hlLW1hcC12MS4xLjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvY2FjaGVtYXAuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9jYWNoZW1hcC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2NhY2hlbWFwLmpzIjpbWyJtYWtlQ2FjaGVNYXBLaXQiLCJtYWtlQ2FjaGVNYXBLaXQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIGV7vwmJwAAJicAACYAAABAZW5kby9jYWNoZS1tYXAtdjEuMS4wL3NyYy9jYWNoZW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUNhY2hlTWFwS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgRXJyb3IsIFR5cGVFcnJvciwgV2Vha01hcCB9ID0gZ2xvYmFsVGhpcztcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyBwYXJzZSwgc3RyaW5naWZ5IH0gPSBKU09OO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCB7IGlzU2FmZUludGVnZXIgfSA9IE51bWJlcjtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCBVTktOT1dOX0tFWSA9IFN5bWJvbCgnVU5LTk9XTl9LRVknKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBvYmplY3QgPyB7IC1yZWFkb25seSBbSyBpbiBrZXlvZiBUXTogVFtLXSB9IDogbmV2ZXJ9IFdyaXRhYmxlRGVlcFxuICogICBJbnRlbnRpb25hbGx5IGxpbWl0ZWQgdG8gbG9jYWwgbmVlZHM7IHJlZmVyIHRvXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0IGlmIGluc3VmZmljaWVudC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcGFyYW0gezxVLD4obmFtZTogc3RyaW5nLCB2YWx1ZTogVSkgPT4gVX0gW3Jldml2ZXJdXG4gKiBAcmV0dXJucyB7V3JpdGFibGVEZWVwPFQ+fVxuICovXG5jb25zdCBkZWVwQ29weUpzb25hYmxlID0gKHZhbHVlLCByZXZpdmVyKSA9PiB7XG4gIGNvbnN0IGVuY29kZWQgPSBzdHJpbmdpZnkodmFsdWUpO1xuICBjb25zdCBkZWNvZGVkID0gcGFyc2UoZW5jb2RlZCwgcmV2aXZlcik7XG4gIHJldHVybiBkZWNvZGVkO1xufTtcblxuY29uc3QgZnJlZXppbmdSZXZpdmVyID0gKF9uYW1lLCB2YWx1ZSkgPT4gZnJlZXplKHZhbHVlKTtcblxuLyoqIEB0eXBlIHs8VCw+KHZhbHVlOiBUKSA9PiBUfSAqL1xuY29uc3QgZGVlcENvcHlBbmRGcmVlemVKc29uYWJsZSA9IHZhbHVlID0+XG4gIGRlZXBDb3B5SnNvbmFibGUodmFsdWUsIGZyZWV6aW5nUmV2aXZlcik7XG5cbi8qKlxuICogQSBjYWNoZSBvZiBib3VuZGVkIHNpemUsIGltcGxlbWVudGluZyB0aGUgV2Vha01hcCBpbnRlcmZhY2UgYnV0IGhvbGRpbmcga2V5c1xuICogc3Ryb25nbHkgaWYgY3JlYXRlZCB3aXRoIGEgbm9uLXdlYWsgYG1ha2VNYXBgIG9wdGlvbiBvZlxuICoge0BsaW5rIG1ha2VDYWNoZU1hcEtpdH0uXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7UGljazxNYXA8SywgVj4sIEV4Y2x1ZGU8a2V5b2YgV2Vha01hcDxXZWFrS2V5LCAqPiwgJ3NldCc+PiAmIHtzZXQ6IChrZXk6IEssIHZhbHVlOiBWKSA9PiBXZWFrTWFwQVBJPEssIFY+fX0gV2Vha01hcEFQSVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7V2Vha01hcEFQSTxLLCBWPiAmICh7Y2xlYXI/OiB1bmRlZmluZWR9IHwgUGljazxNYXA8SywgVj4sICdjbGVhcic+KX0gU2luZ2xlRW50cnlNYXBcbiAqL1xuXG4vKipcbiAqIEEgY2VsbCBvZiBhIGRvdWJseS1saW5rZWQgcmluZyAoY2lyY3VsYXIgbGlzdCkgZm9yIGEgY2FjaGUgbWFwLlxuICogSW5zdGFuY2VzIGFyZSBub3QgZnJvemVuLCBhbmQgc28gc2hvdWxkIGJlIGNsb3NlbHkgZW5jYXBzdWxhdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge29iamVjdH0gQ2FjaGVNYXBDZWxsXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWQgZm9yIGRlYnVnZ2luZ1xuICogQHByb3BlcnR5IHtDYWNoZU1hcENlbGw8SywgVj59IG5leHRcbiAqIEBwcm9wZXJ0eSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBwcmV2XG4gKiBAcHJvcGVydHkge1NpbmdsZUVudHJ5TWFwPEssIFY+fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBwcmV2XG4gKiBAcGFyYW0ge251bWJlcn0gaWRcbiAqIEBwYXJhbSB7U2luZ2xlRW50cnlNYXA8SywgVj59IGRhdGFcbiAqIEByZXR1cm5zIHtDYWNoZU1hcENlbGw8SywgVj59XG4gKi9cbmNvbnN0IGFwcGVuZE5ld0NlbGwgPSAocHJldiwgaWQsIGRhdGEpID0+IHtcbiAgY29uc3QgbmV4dCA9IHByZXY/Lm5leHQ7XG4gIGNvbnN0IGNlbGwgPSB7IGlkLCBuZXh0LCBwcmV2LCBkYXRhIH07XG4gIHByZXYubmV4dCA9IGNlbGw7XG4gIG5leHQucHJldiA9IGNlbGw7XG4gIHJldHVybiBjZWxsO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBjZWxsXG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gcHJldlxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IFtuZXh0XVxuICovXG5jb25zdCBtb3ZlQ2VsbEFmdGVyID0gKGNlbGwsIHByZXYsIG5leHQgPSBwcmV2Lm5leHQpID0+IHtcbiAgaWYgKGNlbGwgPT09IHByZXYgfHwgY2VsbCA9PT0gbmV4dCkgcmV0dXJuOyAvKiBhbHJlYWR5IGluIHBvc2l0aW9uKi9cblxuICAvKiBTcGxpY2Ugb3V0IGNlbGwuKi9cbiAgY29uc3QgeyBwcmV2OiBvbGRQcmV2LCBuZXh0OiBvbGROZXh0IH0gPSBjZWxsO1xuICBvbGRQcmV2Lm5leHQgPSBvbGROZXh0O1xuICBvbGROZXh0LnByZXYgPSBvbGRQcmV2O1xuXG4gIC8qIFNwbGljZSBpbiBjZWxsIGFmdGVyIHByZXYuKi9cbiAgY2VsbC5wcmV2ID0gcHJldjtcbiAgY2VsbC5uZXh0ID0gbmV4dDtcbiAgcHJldi5uZXh0ID0gY2VsbDtcbiAgbmV4dC5wcmV2ID0gY2VsbDtcbn07XG5cbi8qKlxuICogQ2xlYXIgb3V0IGEgY2VsbCB0byBwcmVwYXJlIGl0IGZvciBmdXR1cmUgdXNlLiBJdHMgbWFwIGlzIHByZXNlcnZlZCB3aGVuXG4gKiBwb3NzaWJsZSwgYnV0IG11c3QgaW5zdGVhZCBiZSByZXBsYWNlZCBpZiB0aGUgYXNzb2NpYXRlZCBrZXkgaXMgbm90IGtub3duLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IGNlbGxcbiAqIEBwYXJhbSB7SyB8IFVOS05PV05fS0VZfSBvbGRLZXlcbiAqIEBwYXJhbSB7KCkgPT4gU2luZ2xlRW50cnlNYXA8SywgVj59IFttYWtlTWFwXSByZXF1aXJlZCB3aGVuIHRoZSBrZXkgaXMgdW5rbm93blxuICovXG5jb25zdCByZXNldENlbGwgPSAoY2VsbCwgb2xkS2V5LCBtYWtlTWFwKSA9PiB7XG4gIGlmIChvbGRLZXkgIT09IFVOS05PV05fS0VZKSB7XG4gICAgY2VsbC5kYXRhLmRlbGV0ZShvbGRLZXkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoY2VsbC5kYXRhLmNsZWFyKSB7XG4gICAgY2VsbC5kYXRhLmNsZWFyKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qIFdlYWtNYXAgaW5zdGFuY2VzIG11c3QgYmUgcmVwbGFjZWQgd2hlbiB0aGUga2V5IGlzIHVua25vd24uKi9cbiAgaWYgKCFtYWtlTWFwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ2ludGVybmFsOiBtYWtlTWFwIGlzIHJlcXVpcmVkIHdpdGggVU5LTk9XTl9LRVknKTtcbiAgfVxuICBjZWxsLmRhdGEgPSBtYWtlTWFwKCk7XG59O1xuXG5jb25zdCB6ZXJvTWV0cmljcyA9IGZyZWV6ZSh7XG4gIHRvdGFsUXVlcnlDb3VudDogMCxcbiAgdG90YWxIaXRDb3VudDogMFxuICAvKiBUT0RPPyovXG4gIC8qICogbWV0aG9kLXNwZWNpZmljIGNvdW50cyovXG4gIC8qICogbGl2ZVRvdWNoU3RhdHMvZXZpY3RlZFRvdWNoU3RhdHMgeyBjb3VudCwgc3VtLCBtZWFuLCBtaW4sIG1heCB9Ki9cbiAgLyogKiBwNTAvcDkwL3A5NS9wOTkgdmlhIEJlbi1IYWltL1RvbS1Ub3Ygc3RyZWFtaW5nIGhpc3RvZ3JhbXMqL1xufSk7XG4vKiogQHR5cGVkZWYge3R5cGVvZiB6ZXJvTWV0cmljc30gQ2FjaGVNYXBNZXRyaWNzICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtNYXBDb25zdHJ1Y3RvciB8IFdlYWtNYXBDb25zdHJ1Y3Rvcn0gW0M9V2Vha01hcENvbnN0cnVjdG9yXVxuICogQHRlbXBsYXRlIHtQYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdfSBbSz1QYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdXVxuICogQHRlbXBsYXRlIHt1bmtub3dufSBbVj11bmtub3duXVxuICogQHR5cGVkZWYge29iamVjdH0gQ2FjaGVNYXBLaXRcbiAqIEBwcm9wZXJ0eSB7V2Vha01hcEFQSTxLLCBWPn0gY2FjaGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQ2FjaGVNYXBNZXRyaWNzfSBnZXRNZXRyaWNzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBib3VuZGVkLXNpemUgY2FjaGUgaGF2aW5nIFdlYWtNYXAtY29tcGF0aWJsZVxuICogYGhhc2AvYGdldGAvYHNldGAvYGRlbGV0ZWAgbWV0aG9kcywgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIFNFUyAoc3BlY2lmaWNhbGx5XG4gKiBgYXNzZXJ0YCBlcnJvciBub3RlcykuXG4gKiBLZXkgdmFsaWRpdHksIGNvbXBhcmlzb24sIGFuZCByZWZlcmVudGlhbCBzdHJlbmd0aCBhcmUgY29udHJvbGxlZCBieSB0aGVcbiAqIGBtYWtlTWFwYCBvcHRpb24sIHdoaWNoIGRlZmF1bHRzIHRvIGBXZWFrTWFwYCBidXQgY2FuIGJlIHNldCB0byBhbnkgcHJvZHVjZXJcbiAqIG9mIG9iamVjdHMgd2l0aCB0aG9zZSBtZXRob2RzIChlLmcuLCB1c2luZyBgTWFwYCBhbGxvd3MgZm9yIGFyYml0cmFyeSBrZXlzXG4gKiB3aGljaCB3aWxsIGJlIHN0cm9uZ2x5IGhlbGQpLlxuICogQ2FjaGUgZXZpY3Rpb24gcG9saWN5IGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJhYmxlLCBidXQgc3RyaXZlcyBmb3IgYSBoaXRcbiAqIHJhdGlvIGF0IGxlYXN0IGFzIGdvb2QgYXNcbiAqIFtMUlVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX3JlcGxhY2VtZW50X3BvbGljaWVzI0xSVSkgKGUuZy4sIGl0XG4gKiBtaWdodCBiZVxuICogW0NMT0NLXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYWdlX3JlcGxhY2VtZW50X2FsZ29yaXRobSNDbG9jaylcbiAqIG9yIFtTSUVWRV0oaHR0cHM6Ly9zaWV2ZWNhY2hlLmNvbS8pKS5cbiAqXG4gKiBAdGVtcGxhdGUge01hcENvbnN0cnVjdG9yIHwgV2Vha01hcENvbnN0cnVjdG9yfSBbQz1XZWFrTWFwQ29uc3RydWN0b3JdXG4gKiBAdGVtcGxhdGUge1BhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+WydzZXQnXT5bMF19IFtLPVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+WydzZXQnXT5bMF1dXG4gKiBAdGVtcGxhdGUge3Vua25vd259IFtWPXVua25vd25dXG4gKiBAcGFyYW0ge251bWJlcn0gY2FwYWNpdHlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7QyB8ICgoKSA9PiBTaW5nbGVFbnRyeU1hcDxLLCBWPil9IFtvcHRpb25zLm1ha2VNYXBdXG4gKiBAcmV0dXJucyB7Q2FjaGVNYXBLaXQ8QywgSywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ2FjaGVNYXBLaXQgPSAoY2FwYWNpdHksIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoIWlzU2FmZUludGVnZXIoY2FwYWNpdHkpIHx8IGNhcGFjaXR5IDwgMCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICdjYXBhY2l0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHNhZmUgaW50ZWdlciBudW1iZXIgPD0gMioqNTMgLSAxJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGUgezxWLD4oKSA9PiBTaW5nbGVFbnRyeU1hcDxLLCBWPn1cbiAqL1xuICBjb25zdCBtYWtlTWFwID0gKE1heWJlQ3RvciA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IqL1xuICAgICAgTWF5YmVDdG9yKCk7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChNYXliZUN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciovXG4gICAgICBjb25zdCBjb25zdHJ1Y3ROZXdNYXAgPSAoKSA9PiBuZXcgTWF5YmVDdG9yKCk7XG4gICAgICByZXR1cm4gY29uc3RydWN0TmV3TWFwO1xuICAgIH1cbiAgfSkob3B0aW9ucy5tYWtlTWFwID8/IFdlYWtNYXApO1xuICBjb25zdCB0YWcgPVxuICAgIC8qKiBAdHlwZSB7YW55fSAqLyAobWFrZU1hcCgpKS5jbGVhciA9PT0gdW5kZWZpbmVkXG4gICAgICA/ICdXZWFrQ2FjaGVNYXAnXG4gICAgICA6ICdDYWNoZU1hcCc7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIENhY2hlTWFwQ2VsbDxLLCBWPj59ICovXG4gIGNvbnN0IGtleVRvQ2VsbCA9IG1ha2VNYXAoKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB0aGlzIHNlbnRpbmVsIGhlYWQgaXMgc3BlY2lhbCovXG4gIGNvbnN0IGhlYWQgPSAvKiogQHR5cGUge0NhY2hlTWFwQ2VsbDxLLCBWPn0gKi8gKHtcbiAgICBpZDogMCxcbiAgICAvKiBuZXh0IGFuZCBwcmV2IGFyZSBlc3RhYmxpc2hlZCBiZWxvdyBhcyBzZWxmLXJlZmVyZW50aWFsLiovXG4gICAgbmV4dDogdW5kZWZpbmVkLFxuICAgIHByZXY6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICBoYXM6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2ludGVybmFsOiBzZW50aW5lbCBoZWFkIGNlbGwgaGFzIG5vIGRhdGEnKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIGhlYWQubmV4dCA9IGhlYWQ7XG4gIGhlYWQucHJldiA9IGhlYWQ7XG4gIGxldCBjZWxsQ291bnQgPSAwO1xuXG4gIGNvbnN0IG1ldHJpY3MgPSBkZWVwQ29weUpzb25hYmxlKHplcm9NZXRyaWNzKTtcbiAgY29uc3QgZ2V0TWV0cmljcyA9ICgpID0+IGRlZXBDb3B5QW5kRnJlZXplSnNvbmFibGUobWV0cmljcyk7XG5cbiAgLyoqXG4gKiBUb3VjaGluZyBtb3ZlcyBhIGNlbGwgdG8gZmlyc3QgcG9zaXRpb24gc28gTFJVIGV2aWN0aW9uIGNhbiB0YXJnZXQgdGhlIGxhc3RcbiAqIGNlbGwgKGBoZWFkLnByZXZgKS5cbiAqXG4gKiBAdHlwZSB7KGtleTogSykgPT4gKENhY2hlTWFwQ2VsbDxLLCBWPiB8IHVuZGVmaW5lZCl9XG4gKi9cbiAgY29uc3QgdG91Y2hLZXkgPSBrZXkgPT4ge1xuICAgIG1ldHJpY3MudG90YWxRdWVyeUNvdW50ICs9IDE7XG4gICAgY29uc3QgY2VsbCA9IGtleVRvQ2VsbC5nZXQoa2V5KTtcbiAgICBpZiAoIWNlbGw/LmRhdGEuaGFzKGtleSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBtZXRyaWNzLnRvdGFsSGl0Q291bnQgKz0gMTtcbiAgICBtb3ZlQ2VsbEFmdGVyKGNlbGwsIGhlYWQpO1xuICAgIHJldHVybiBjZWxsO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnaGFzJ119ICovXG4gIGNvbnN0IGhhcyA9IGtleSA9PiB7XG4gICAgY29uc3QgY2VsbCA9IHRvdWNoS2V5KGtleSk7XG4gICAgcmV0dXJuIGNlbGwgIT09IHVuZGVmaW5lZDtcbiAgfTtcbiAgZnJlZXplKGhhcyk7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+WydnZXQnXX0gKi9cbiAgY29uc3QgZ2V0ID0ga2V5ID0+IHtcbiAgICBjb25zdCBjZWxsID0gdG91Y2hLZXkoa2V5KTtcbiAgICByZXR1cm4gY2VsbD8uZGF0YS5nZXQoa2V5KTtcbiAgfTtcbiAgZnJlZXplKGdldCk7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+WydzZXQnXX0gKi9cbiAgY29uc3Qgc2V0ID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICBsZXQgY2VsbCA9IHRvdWNoS2V5KGtleSk7XG4gICAgaWYgKGNlbGwpIHtcbiAgICAgIGNlbGwuZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uO1xuICAgIH1cblxuICAgIGlmIChjZWxsQ291bnQgPCBjYXBhY2l0eSkge1xuICAgICAgLyogQWRkIGFuZCB1c2UgYSBuZXcgY2VsbCBhdCBmaXJzdCBwb3NpdGlvbi4qL1xuICAgICAgY2VsbCA9IGFwcGVuZE5ld0NlbGwoaGVhZCwgY2VsbENvdW50ICsgMSwgbWFrZU1hcCgpKTtcbiAgICAgIGNlbGxDb3VudCArPSAxOyAvKiBpbnRlbnRpb25hbGx5IGZvbGxvd3MgY2VsbCBjcmVhdGlvbiovXG4gICAgICBjZWxsLmRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoY2FwYWNpdHkgPiAwKSB7XG4gICAgICAvKiBSZXVzZSB0aGUgY3VycmVudCB0YWlsLCBtb3ZpbmcgaXQgdG8gZmlyc3QgcG9zaXRpb24uKi9cbiAgICAgIGNlbGwgPSBoZWFkLnByZXY7XG4gICAgICByZXNldENlbGwoLyoqIEB0eXBlIHthbnl9ICovIChjZWxsKSwgVU5LTk9XTl9LRVksIG1ha2VNYXApO1xuICAgICAgY2VsbC5kYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIG1vdmVDZWxsQWZ0ZXIoY2VsbCwgaGVhZCk7XG4gICAgfVxuXG4gICAgLyogRG9uJ3QgZXN0YWJsaXNoIHRoaXMgZW50cnkgdW50aWwgcHJpb3Igc3RlcHMgc3VjY2VlZC4qL1xuICAgIGlmIChjZWxsKSBrZXlUb0NlbGwuc2V0KGtleSwgY2VsbCk7XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbjtcbiAgfTtcbiAgZnJlZXplKHNldCk7XG5cbiAgLyogXCJkZWxldGVcIiBpcyBhIGtleXdvcmQuKi9cbiAgY29uc3QgeyBkZWxldGU6IGRlbGV0ZUVudHJ5IH0gPSB7XG4gICAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+WydkZWxldGUnXX0gKi9cbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBjb25zdCBjZWxsID0ga2V5VG9DZWxsLmdldChrZXkpO1xuICAgICAgaWYgKCFjZWxsPy5kYXRhLmhhcyhrZXkpKSB7XG4gICAgICAgIGtleVRvQ2VsbC5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbW92ZUNlbGxBZnRlcihjZWxsLCBoZWFkLnByZXYpO1xuICAgICAgcmVzZXRDZWxsKGNlbGwsIGtleSk7XG4gICAgICBrZXlUb0NlbGwuZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xuICBmcmVlemUoZGVsZXRlRW50cnkpO1xuXG4gIGNvbnN0IGltcGxlbWVudGF0aW9uID0gLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+fSAqLyAoe1xuICAgIGhhcyxcbiAgICBnZXQsXG4gICAgc2V0LFxuICAgIGRlbGV0ZTogZGVsZXRlRW50cnksXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL2NoZWNrLXR5cGVzKi9cbiAgICBbLyoqIEB0eXBlIHt0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnfSAqLyAodG9TdHJpbmdUYWdTeW1ib2wpXTogdGFnLFxuICB9KTtcbiAgZnJlZXplKGltcGxlbWVudGF0aW9uKTtcblxuICBjb25zdCBraXQgPSB7IGNhY2hlOiBpbXBsZW1lbnRhdGlvbiwgZ2V0TWV0cmljcyB9O1xuICByZXR1cm4gZnJlZXplKGtpdCk7XG59OyRozY9fb25jZS5tYWtlQ2FjaGVNYXBLaXQobWFrZUNhY2hlTWFwS2l0KTtcbmZyZWV6ZShtYWtlQ2FjaGVNYXBLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUNhY2hlTWFwS2l0IjpbIm1ha2VDYWNoZU1hcEtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvUSGPYQsAAGELAAAsAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi90aHJvdy1sYWJlbGVkLmpzIl0sImV4cG9ydHMiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxpc1Byb21pc2UsdGhyb3dMYWJlbGVkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi90aHJvdy1sYWJlbGVkLmpzXCIsIFtbXCJ0aHJvd0xhYmVsZWRcIixbJGjNj19hID0+ICh0aHJvd0xhYmVsZWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBDYWxscyBgZnVuYyguLi5hcmdzKWAsIGJ1dCBhbm5vdGF0aW5nIGFueSBmYWlsdXJlIGVycm9yIHdpdGggYGxhYmVsYC5cbiAqXG4gKiBJZiBgbGFiZWxgIGlzIG9taXR0ZWQgb3IgYHVuZGVmaW5lZGAsIHRoZW4gdGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gKiBgZnVuYyguLi5hcmdzKS5cbiAqXG4gKiBPdGhlcndpc2UsIGlmIGl0IHN1Y2Nlc3NmdWxseSByZXR1cm5zIGEgbm9uLXByb21pc2UsIHRoYXQgbm9uLXByb21pc2UgaXNcbiAqIHJldHVybmVkLlxuICpcbiAqIElmIGl0IHRocm93cywgcmV0aHJvdyBhIHNpbWlsYXIgZXJyb3Igd2hvc2UgbWVzc2FnZSBpc1xuICogYGBganNcbiAqIGAke2xhYmVsfTogJHtvcmlnaW5hbE1lc3NhZ2V9YFxuICogYGBgXG4gKiBUaGF0IHdheSwgaW4gYW4gZXJyb3IgaGFwcGVucyBkZWVwIHdpdGhpbiBhIHN0YWNrIG9mIGNhbGxzIHRvXG4gKiBgYXBwbHlMYWJlbGluZ0Vycm9yYCwgdGhlIHJlc3VsdGluZyBlcnJvciB3aWxsIHNob3cgdGhlIHN0YWNrIG9mIGxhYmVscy5cbiAqXG4gKiBJZiBpdCByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiBgYXBwbHlMYWJlbGluZ0Vycm9yYCBjYW5ub3QgdGVsbCB1bnRpbCB0aGF0XG4gKiBwcm9taXNlIHNldHRsZXMgd2hldGhlciBpdCByZXByZXNlbnRzIGEgc3VjY2VzcyBvciBmYWlsdXJlLiBTbyBpdCBpbW1lZGlhdGVseVxuICogcmV0dXJucyBhIG5ldyBwcm9taXNlLiBJZiB0aGUgb3JpZ2luYWwgcHJvbWlzZSBmdWxmaWxscywgdGhlbiB0aGVcbiAqIGZ1bGZpbGxtZW50IGlzIHByb3BhZ2F0ZWQgdG8gdGhlIHJldHVybmVkIHByb21pc2UuXG4gKlxuICogSWYgdGhlIHByb21pc2UgcmVqZWN0cyB3aXRoIGFuIGVycm9yLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzXG4gKiByZWplY3RlZCB3aXRoIGEgc2ltaWxhciBwcm9taXNlLCBwcmVmaXhlZCB3aXRoIHRoZSBsYWJlbCBpbiB0aGF0IHNhbWUgd2F5LlxuICpcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbiAgICAgICBjb25zdCBhcHBseUxhYmVsaW5nRXJyb3IgPSAoZnVuYywgYXJncywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgaWYgKGxhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZnVuYyguLi5hcmdzKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93TGFiZWxlZChlcnIsIGxhYmVsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAvKiBDYW5ub3QgYmUgYXQtdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgaXMgbm8gdHlwZSBlcnJvciBsb2NhbGx5LiovXG4gICAgLyogUmF0aGVyLCBhIHR5cGUgZXJyb3Igb25seSBhcyBpbXBvcnRlZCBpbnRvIGV4by4qL1xuICAgIC8qIEB0cy1pZ25vcmUgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbiAgICAvKiByZXR1cm4gYSBwcm9taXNlIHdpdGggYSBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMqL1xuICAgIC8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4gICAgLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbiAgICAvKiBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuICAgIC8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbiAgICAvKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xuICAgIHJldHVybiBFLndoZW4ocmVzdWx0LCB1bmRlZmluZWQsIHJlYXNvbiA9PiB0aHJvd0xhYmVsZWQocmVhc29uLCBsYWJlbCkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07JGjNj19vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEj4QsrdBQAA3QUAACsAAABAZW5kby9jb21tb24tdjEuMi4xMy9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEBwYXJhbSB7SXRlcmFibGU8cmVhZG9ubHkgW1Byb3BlcnR5S2V5LCBUXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7IFtrOiBzdHJpbmddOiBUOyB9fVxuICovXG4gICAgICAgY29uc3QgZnJvbVVuaXF1ZUVudHJpZXMgPSBhbGxFbnRyaWVzID0+IHtcbiAgY29uc3QgZW50cmllc0FycmF5ID0gWy4uLmFsbEVudHJpZXNdO1xuICBjb25zdCByZXN1bHQgPSBoYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG4gIGlmIChvd25LZXlzKHJlc3VsdCkubGVuZ3RoID09PSBlbnRyaWVzQXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgX10gb2YgZW50cmllc0FycmF5KSB7XG4gICAgaWYgKG5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgRmFpbGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuICAgIH1cbiAgICBuYW1lcy5hZGQobmFtZSk7XG4gIH1cbiAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG59OyRozY9fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt5VT7iUIAAAlCAAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2lkZW50LWNoZWNrZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlkZW50Q2hlY2tlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBUT0RPIENvbXBsZXRlIG1pZ3JhdGlvbiBvZiBDaGVja2VyIHR5cGUgZnJvbSBAZW5kby9wYXNzLXN0eWxlIHRvIEBlbmRvL2NvbW1vbiovXG4vKiBieSBoYXZpbmcgQGVuZG8vcGFzcy1zdHlsZSwgYW5kIGV2ZXJ5b25lIGVsc2Ugd2hvIG5lZWRzIGl0LCBpbXBvcnQgaXQgZnJvbSovXG4vKiBgQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNgLiovXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja2VyXG4gKiBJbnRlcm5hbCB0byBhIHVzZWZ1bCBwYXR0ZXJuIGZvciB3cml0aW5nIGNoZWNraW5nIGxvZ2ljXG4gKiAoYSBcImNoZWNrRm9vXCIgZnVuY3Rpb24pIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGEgcHJlZGljYXRlXG4gKiAoYW4gXCJpc0Zvb1wiIGZ1bmN0aW9uKSBvciBhIHZhbGlkYXRvciAoYW4gXCJhc3NlcnRGb29cIiBmdW5jdGlvbikuXG4gKlxuICogICAgKiBBIHByZWRpY2F0ZSBpZGVhbGx5IG9ubHkgcmV0dXJucyBgdHJ1ZWAgb3IgYGZhbHNlYCBhbmQgcmFyZWx5IHRocm93cy5cbiAqICAgICogQSB2YWxpZGF0b3IgdGhyb3dzIGFuIGluZm9ybWF0aXZlIGRpYWdub3N0aWMgd2hlbiB0aGUgcHJlZGljYXRlXG4gKiAgICAgIHdvdWxkIGhhdmUgcmV0dXJuZWQgYGZhbHNlYCwgYW5kIHNpbXBseSByZXR1cm5zIGB1bmRlZmluZWRgIG5vcm1hbGx5XG4gKiAgICAgIHdoZW4gdGhlIHByZWRpY2F0ZSB3b3VsZCBoYXZlIHJldHVybmVkIGB0cnVlYC5cbiAqICAgICogVGhlIGludGVybmFsIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgdGhleSBzaGFyZSBpcyBwYXJhbWV0ZXJpemVkIGJ5IGFcbiAqICAgICAgYENoZWNrZXJgIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gcHJvY2VlZCB3aXRoIGEgZmFpbHVyZSBjb25kaXRpb24uXG4gKiAgICAgIFByZWRpY2F0ZXMgcGFzcyBpbiBhbiBpZGVudGl0eSBmdW5jdGlvbiBhcyBjaGVja2VyLiBWYWxpZGF0b3JzXG4gKiAgICAgIHBhc3MgaW4gYGFzc2VydENoZWNrZXJgIHdoaWNoIGlzIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBgYXNzZXJ0YC5cbiAqXG4gKiBTZWUgdGhlIHZhcmlvdXMgdXNlcyBmb3IgZ29vZCBleGFtcGxlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uZFxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLkRldGFpbHN9IFtkZXRhaWxzXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbiAgICAgICBjb25zdCBpZGVudENoZWNrZXIgPSAoY29uZCwgX2RldGFpbHMpID0+IGNvbmQ7JGjNj19vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGGv/Gq4BAAAuAQAACcAAABAZW5kby9jb21tb24tdjEuMi4xMy9saXN0LWRpZmZlcmVuY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImxpc3REaWZmZXJlbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHByZXNlbnQgaW4gdGhlIGBsZWZ0TGlzdGAgYW5kIG5vdFxuICogaW4gdGhlIGByaWdodExpc3RgLiBSZXR1cm4gaW4gdGhlIG9yZGVyIG9mIHRoZWlyIGFwcGVhcmFuY2UgaW4gYGxlZnRMaXN0YC5cbiAqIFVzZXMgdGhlIGNvbXBhcmlzb24gYnVpbHQgaW50byBgU2V0YCBtZW1iZXJzaGlwIChTYW1lVmFsdWVaZXJvKVxuICogd2hpY2ggaXMgbGlrZSBKYXZhU2NyaXB0J3MgYD09PWAgZXhjZXB0IHRoYXQgaXQganVkZ2VzIGFueSBgTmFOYCB0b1xuICogYmUgdGhlIHNhbWUgYXMgYW55IGBOYU5gIGFuZCBpdCBqdWRnZXMgYDBgIHRvIGJlIHRoZSBzYW1lIGEgYC0wYC5cbiAqXG4gKiBUaGlzIGlzIG9mdGVuIHVzZWQgb24gbGlzdHMgb2YgbmFtZXMgdGhhdCBzaG91bGQgbWF0Y2gsIGluIG9yZGVyIHRvIGdlbmVyYXRlXG4gKiB1c2VmdWwgZGlhZ25vc3RpY3MgYWJvdXQgdGhlIHVubWF0Y2hlZCBuYW1lcy5cbiAqXG4gKiBAdGVtcGxhdGUge2FueX0gVlxuICogQHBhcmFtIHtWW119IGxlZnRMaXN0XG4gKiBAcGFyYW0ge1ZbXX0gcmlnaHRMaXN0XG4gKi9cbiAgICAgICBjb25zdCBsaXN0RGlmZmVyZW5jZSA9IChsZWZ0TGlzdCwgcmlnaHRMaXN0KSA9PiB7XG4gIGNvbnN0IHJpZ2h0U2V0ID0gbmV3IFNldChyaWdodExpc3QpO1xuICByZXR1cm4gbGVmdExpc3QuZmlsdGVyKGVsZW1lbnQgPT4gIXJpZ2h0U2V0LmhhcyhlbGVtZW50KSk7XG59OyRozY9fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJexd93kEAAB5BAAAKwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtYXJyYXktaXRlcmF0b3IuanN7ImltcG9ydHMiOlsiLi9tYWtlLWl0ZXJhdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZUFycmF5SXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlSXRlcmF0b3I7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQSBgaGFyZGVuYGluZyBhbmFsb2cgb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0uXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0FycmF5PFQ+fSBhcnJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFycmF5SXRlcmF0b3IgPSBhcnIgPT4ge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYXJyO1xuICBsZXQgaSA9IDA7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgIHZhbHVlID0gYXJyW2ldO1xuICAgICAgaSArPSAxO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgICB9XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdGVybWluYWwgdmFsdWUgZG9lc24ndCBtYXR0ZXIqL1xuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFycmF5SXRlcmF0b3IiOlsibWFrZUFycmF5SXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXTavegYDAAAGAwAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIE1ha2VzIGEgb25lLXNob3QgaXRlcmFibGUgaXRlcmF0b3IgZnJvbSBhIHByb3ZpZGVkIGBuZXh0YCBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VD59IG5leHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUl0ZXJhdG9yID0gbmV4dCA9PiB7XG4gIGNvbnN0IGl0ZXIgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBpdGVyLFxuICAgIG5leHQsXG4gIH0pO1xuICByZXR1cm4gaXRlcjtcbn07JGjNj19vbmNlLm1ha2VJdGVyYXRvcihtYWtlSXRlcmF0b3IpO1xuaGFyZGVuKG1ha2VJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSXRlcmF0b3IiOlsibWFrZUl0ZXJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHbnqxlvCgAAbwoAACIAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8a2V5b2YgTywgUj59XG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNYXAgPSAob3JpZ2luYWwsIG1hcEZuKSA9PiB7XG4gIGNvbnN0IGVudHMgPSBlbnRyaWVzKG9yaWdpbmFsKTtcbiAgY29uc3QgbWFwRW50cyA9IGVudHMubWFwKFxuICAgIChbaywgdl0pID0+IC8qKiBAdHlwZSB7W2tleW9mIE8sIFJdfSAqLyAoW2ssIG1hcEZuKHYsIGspXSksXG4gICk7XG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxrZXlvZiBPLCBSPn0gKi8gKGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqJog2jsJAAA7CQAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tZXRhLW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWV0YU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBMaWtlIGBvYmplY3RNYXBgLCBidXQgYXQgdGhlIHJlZmxlY3RpdmUgbGV2ZWwgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnNcbiAqIHJhdGhlciB0aGFuIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBFeGNlcHQgZm9yIGhhcmRlbmluZywgdGhlIGVkZ2UgY2FzZSBiZWhhdmlvciBpcyBtb3N0bHkgdGhlIG9wcG9zaXRlIG9mXG4gKiB0aGUgYG9iamVjdE1hcGAgZWRnZSBjYXNlcy5cbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIEFsbCBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWwgYXJlIG1hcHBlZCwgZXZlbiBpZiBzeW1ib2wtbmFtZWRcbiAqICAgICAgb3Igbm9uLWVudW1lcmFibGUuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgdGhlIGRlc2NyaXB0b3JcbiAqICAgICAgY29udGFpbmluZyB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXJlIGdpdmVuIHRvIGBtZXRhTWFwRm5gLlxuICogICAgKiBUaGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIGFyZSBhY2NvcmRpbmcgdG8gdGhlIGRlc2NyaXB0b3JzXG4gKiAgICAgIHJldHVybmVkIGJ5IGBtZXRhTWFwRm5gLlxuICogICAgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IHdob3NlIHN0YXRlIGlzXG4gKiAgICAgIG9ubHkgdGhlc2UgbWFwcGVkIG93biBwcm9wZXJ0aWVzLiBJdCB3aWxsIGluaGVyaXQgZnJvbSB0aGUgdGhpcmRcbiAqICAgICAgYXJndW1lbnQgaWYgcHJvdmlkZWQsIGRlZmF1bHRpbmcgdG8gYE9iamVjdC5wcm90b3R5cGVgIGlmIG9taXR0ZWQuXG4gKlxuICogQmVjYXVzZSBhIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgZGlzdGluY3QgZnJvbSBgdW5kZWZpbmVkYCwgd2UgYnVuZGxlXG4gKiBtYXBwaW5nIGFuZCBmaWx0ZXJpbmcgdG9nZXRoZXIuIFdoZW4gdGhlIGBtZXRhTWFwRm5gIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gKiB0aGF0IHByb3BlcnR5IGlzIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAcGFyYW0geyhcbiAqICAgZGVzYzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8T1trZXlvZiBPXT4sXG4gKiAgIGtleToga2V5b2YgT1xuICogKSA9PiAoUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkKX0gbWV0YU1hcEZuXG4gKiBAcGFyYW0ge2FueX0gW3Byb3RvXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1ldGFNYXAgPSAoXG4gIG9yaWdpbmFsLFxuICBtZXRhTWFwRm4sXG4gIHByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcbikgPT4ge1xuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpO1xuICBjb25zdCBrZXlzID0gb3duS2V5cyhvcmlnaW5hbCk7XG5cbiAgY29uc3QgZGVzY0VudHJpZXMgPSAvKiogQHR5cGUge1tQcm9wZXJ0eUtleSxQcm9wZXJ0eURlc2NyaXB0b3JdW119ICovIChcbiAgICBrZXlzXG4gICAgICAubWFwKGtleSA9PiBba2V5LCBtZXRhTWFwRm4oZGVzY3Nba2V5XSwga2V5KV0pXG4gICAgICAuZmlsdGVyKChbX2tleSwgb3B0RGVzY10pID0+IG9wdERlc2MgIT09IHVuZGVmaW5lZClcbiAgKTtcbiAgcmV0dXJuIGhhcmRlbihjcmVhdGUocHJvdG8sIGZyb21FbnRyaWVzKGRlc2NFbnRyaWVzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWV0YU1hcChvYmplY3RNZXRhTWFwKTtcbmhhcmRlbihvYmplY3RNZXRhTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1ldGFNYXAiOlsib2JqZWN0TWV0YU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADYs0GCmQUAAJkFAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEdpdmVuIGFuIGVycm9yIGBpbm5lckVycmAgYW5kIGEgYGxhYmVsYCwgdGhyb3dzIGEgc2ltaWxhclxuICogZXJyb3Igd2hvc2UgbWVzc2FnZSBzdHJpbmcgaXMgYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YC5cbiAqIFNlZSBgYXBwbHlMYWJlbGluZ0Vycm9yYCBmb3IgdGhlIG1vdGl2YXRpbmcgdXNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3J9IFtlcnJDb25zdHJ1Y3Rvcl1cbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5Bc3NlcnRNYWtlRXJyb3JPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuICAgICAgIGNvbnN0IHRocm93TGFiZWxlZCA9IChcbiAgaW5uZXJFcnIsXG4gIGxhYmVsLFxuICBlcnJDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZCxcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJykge1xuICAgIGxhYmVsID0gYFske2xhYmVsfV1gO1xuICB9XG4gIGNvbnN0IG91dGVyRXJyID0gbWFrZUVycm9yKFxuICAgIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG4gICAgZXJyQ29uc3RydWN0b3IsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgYW5ub3RhdGVFcnJvcihvdXRlckVyciwgWGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbiAgdGhyb3cgb3V0ZXJFcnI7XG59OyRozY9fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2Vudi1vcHRpb25zLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALwBM4I4FgAAOBYAACwAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLWNoZWNrKi9cblxuLyogYEBlbmRvL2Vudi1vcHRpb25zYCBuZWVkcyB0byBiZSBpbXBvcnRlZCBxdWl0ZSBlYXJseSwgYW5kIHNvIHNob3VsZCovXG4vKiBhdm9pZCBpbXBvcnRpbmcgZnJvbSBzZXMgb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHNlcy4qL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQcmVsdWRlIG9mIGNoZWFwIGdvb2QgLSBlbm91Z2ggaW1pdGF0aW9ucyBvZiB0aGluZ3Mgd2UnZCB1c2Ugb3IqL1xuLyogZG8gZGlmZmVyZW50bHkgaWYgd2UgY291bGQgZGVwZW5kIG9uIHNlcyovXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgbG9jYWxUaGlzID0gZ2xvYmFsVGhpcztcblxuY29uc3QgeyBPYmplY3QsIFJlZmxlY3QsIEFycmF5LCBTdHJpbmcsIEpTT04sIEVycm9yIH0gPSBsb2NhbFRoaXM7XG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyogU2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBpbiBzZXMnIGNvbW1vbnMuanMgZXZlbiB0aG91Z2ggaXQqL1xuLyogdXNlcyB0aGUgb3RoZXIgdGVjaG5pcXVlLiovXG5jb25zdCB1bmN1cnJ5VGhpcyA9XG4gIGZuID0+XG4gIChyZWNlaXZlciwgLi4uYXJncykgPT5cbiAgICBhcHBseShmbiwgcmVjZWl2ZXIsIGFyZ3MpO1xuY29uc3QgYXJyYXlQdXNoID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlJbmNsdWRlcyA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG5jb25zdCBzdHJpbmdTcGxpdCA9IHVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUuc3BsaXQpO1xuXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEZhaWwgPSAobGl0ZXJhbHMsIC4uLmFyZ3MpID0+IHtcbiAgbGV0IG1zZyA9IGxpdGVyYWxzWzBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBtc2cgPSBgJHttc2d9JHthcmdzW2ldfSR7bGl0ZXJhbHNbaSArIDFdfWA7XG4gIH1cbiAgdGhyb3cgRXJyb3IobXNnKTtcbn07XG5cbi8qIGVuZCBwcmVsdWRlKi9cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgbWFrZUVudmlyb25tZW50Q2FwdG9yYCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZ2V0dGluZyBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBuZWVkZWQsIGFuZCBhIHdheSB0byBjYXRhbG9nIHRoZSBuYW1lcyBvZiBhbGxcbiAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3ZXJlIGNhcHR1cmVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhR2xvYmFsXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtkcm9wTmFtZXNdIERlZmF1bHRzIHRvIGZhbHNlLiBJZiB0cnVlLCBkb24ndCB0cmFja1xuICogbmFtZXMgdXNlZC5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdE90aGVyVmFsdWVzXVxuICogSWYgcHJvdmlkZWQsIHRoZSBvcHRpb24gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBvciBtYXRjaCBgZGVmYXVsdFNldHRpbmdgLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbiA9IChcbiAgICBvcHRpb25OYW1lLFxuICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgIG9wdE90aGVyVmFsdWVzID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICB0eXBlb2Ygb3B0aW9uTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWUgJHtxKG9wdGlvbk5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG4gICAgdHlwZW9mIGRlZmF1bHRTZXR0aW5nID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gZGVmYXVsdCBzZXR0aW5nICR7cShcbiAgICAgICAgZGVmYXVsdFNldHRpbmcsXG4gICAgICApfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG5cbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgc2V0dGluZyA9IGRlZmF1bHRTZXR0aW5nO1xuICAgIGNvbnN0IGdsb2JhbFByb2Nlc3MgPSBhR2xvYmFsLnByb2Nlc3MgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdsb2JhbEVudiA9XG4gICAgICAodHlwZW9mIGdsb2JhbFByb2Nlc3MgPT09ICdvYmplY3QnICYmIGdsb2JhbFByb2Nlc3MuZW52KSB8fCB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxFbnYgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAob3B0aW9uTmFtZSBpbiBnbG9iYWxFbnYpIHtcbiAgICAgICAgaWYgKCFkcm9wTmFtZXMpIHtcbiAgICAgICAgICBhcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLCBvcHRpb25OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdsb2JhbEVudltvcHRpb25OYW1lXTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFtUPXN0cmluZ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QgPSBvcHRpb25OYW1lID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSBnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnJyk7XG4gICAgcmV0dXJuIGZyZWV6ZShvcHRpb24gPT09ICcnID8gW10gOiBzdHJpbmdTcGxpdChvcHRpb24sICcsJykpO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gW1Q9c3RyaW5nXVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7VH0gZWxlbWVudFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9IChvcHRpb25OYW1lLCBlbGVtZW50KSA9PlxuICAgIGFycmF5SW5jbHVkZXMoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChvcHRpb25OYW1lKSwgZWxlbWVudCk7XG5cbiAgY29uc3QgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzID0gKCkgPT4ge1xuICAgIHJldHVybiBmcmVlemUoWy4uLmNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc10pO1xuICB9O1xuICBmcmVlemUoZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzKTtcblxuICByZXR1cm4gZnJlZXplKHtcbiAgICBnZXRFbnZpcm9ubWVudE9wdGlvbixcbiAgICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICAgIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG4gICAgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5cbi8qKlxuICogRm9yIHRoZSBzaW1wbGUgY2FzZSwgd2hlcmUgdGhlIGdsb2JhbCBpbiBxdWVzdGlvbiBpcyBgZ2xvYmFsVGhpc2AgYW5kIG5vXG4gKiByZXBvcnRpbmcgb2Ygb3B0aW9uIG5hbWVzIGlzIGRlc2lyZWQuXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGdldEVudmlyb25tZW50T3B0aW9uLFxuICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxufSA9IG1ha2VFbnZpcm9ubWVudENhcHRvcihsb2NhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAamZ24mQNAABkDQAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhlIGV4aXN0ZW5jZSBvZiBhIG5vbi1zdGFuZGFyZCBgYXNzZXJ0YCBob3N0IG9iamVjdC4qL1xuLyogU0VTIHZlcnNpb24gMC4xMS4wIGludHJvZHVjZXMgdGhpcyBnbG9iYWwgb2JqZWN0IGFuZCBlbnRhbmdsZXMgaXQqL1xuLyogd2l0aCB0aGUgYGNvbnNvbGVgIGhvc3Qgb2JqZWN0IGluIHNjb3BlIHdoZW4gaXQgaW5pdGlhbGl6ZXMsKi9cbi8qIGFsbG93aW5nIGVycm9ycywgcGFydGljdWxhcmx5IGFzc2VydGlvbiBlcnJvcnMsIHRvIGhpZGUgdGhlaXIgXCJkZXRhaWxzXCIqL1xuLyogZnJvbSBjYWxsZXJzIHRoYXQgbWlnaHQgY2F0Y2ggdGhvc2UgZXJyb3JzLCB0aGVuIHJldmVhbCB0aGVtIHRvIHRoZSovXG4vKiB1bmRlcmx5aW5nIGNvbnNvbGUuKi9cbi8qIFRvIHRoZSBleHRlbnQgdGhhdCB0aGlzIGBjb25zb2xlYCBpcyBjb25zaWRlcmVkIGEgcmVzb3VyY2UsKi9cbi8qIHRoaXMgbW9kdWxlIG11c3QgYmUgY29uc2lkZXJlZCBhIHJlc291cmNlIG1vZHVsZS4qL1xuXG4vKiBUaGUgYXNzZXJ0aW9ucyByZS1leHBvcnRlZCBoZXJlIGFyZSBkZWZpbmVkIGluKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci9hc3NlcnQuanMqL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgLFxuICApO1xufVxuXG5jb25zdCBtaXNzaW5nID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ3R5cGVvZicsXG4gICdlcnJvcicsXG4gICdmYWlsJyxcbiAgJ2VxdWFsJyxcbiAgJ3N0cmluZycsXG4gICdub3RlJyxcbiAgJ2RldGFpbHMnLFxuICAnRmFpbCcsXG4gICdxdW90ZScsXG4gIC8qIEFzIG9mIDIwMjQtMDIsIHRoZSBBZ29yaWMgY2hhaW4ncyBib290c3RyYXAgdmF0IHJ1bnMgd2l0aCBhIHZlcnNpb24gb2YgU0VTIHRoYXQqL1xuICAvKiBwcmVkYXRlcyBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCB0b2xlcmF0ZSBpdHMgYWJzZW5jZSBhbmQgZmFsbCovXG4gIC8qIGJhY2sgdG8gcXVvdGUgYmVoYXZpb3IgaW4gdGhhdCBlbnZpcm9ubWVudCAoc2VlIGJlbG93KS4qL1xuICAvKiAnYmFyZScsKi9cbiAgJ21ha2VBc3NlcnQnLFxuXSkuZmlsdGVyKG5hbWUgPT4gZ2xvYmFsQXNzZXJ0W25hbWVdID09PSB1bmRlZmluZWQpO1xuaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9YCxcbiAgKTtcbn1cblxuLyogVGhlIGdsb2JhbCBhc3NlcnQgbWl4ZWQgYXNzZXJ0aW9ucyBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuKi9cbi8qIFRoaXMgbW9kdWxlIHNwbGl0cyB0aGVtIGFwYXJ0Ki9cbi8qIGFuZCBhbHNvIHVwZGF0ZXMgdGhlIG5hbWVzIG9mIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucy4qL1xuY29uc3Qge1xuICBiYXJlLFxuICBkZXRhaWxzOiByZWRhY3RlZCxcbiAgZXJyb3I6IG1ha2VFcnJvcixcbiAgRmFpbDogdGhyb3dSZWRhY3RlZCxcbiAgbWFrZUFzc2VydDogX29taXR0ZWRNYWtlQXNzZXJ0LFxuICBub3RlLFxuICBxdW90ZSxcbiAgLi4uYXNzZXJ0aW9uc1xufSA9IGdsb2JhbEFzc2VydDtcbi8qKiBAdHlwZSB7SU1QT1JUKFwic2VzXCIpLkFzc2VydGlvbkZ1bmN0aW9ucyB9ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIG1pc3NpbmcgcHJvcGVydGllcyBhc3NpZ25lZCBuZXh0Ki8kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO1xuY29uc3QgYXNzZXJ0ID0gKHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKSA9PlxuICBnbG9iYWxBc3NlcnQodmFsdWUsIG9wdERldGFpbHMsIGVyckNvbnRydWN0b3IsIG9wdGlvbnMpOyRozY9fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbk9iamVjdC5hc3NpZ24oYXNzZXJ0LCBhc3NlcnRpb25zKTtcblxuLyogQXMgb2YgMjAyNC0wMiwgdGhlIEFnb3JpYyBjaGFpbidzIGJvb3RzdHJhcCB2YXQgcnVucyB3aXRoIGEgdmVyc2lvbiBvZiBTRVMqL1xuLyogdGhhdCBwcmVkYXRlcyB0aGUgYWRkaXRpb24gb2YgdGhlICdiYXJlJyBtZXRob2QsIHNvIHdlIG11c3QgZmFsbCBiYWNrIHRvKi9cbi8qIHF1b3RlIGJlaGF2aW9yIGZvciB0aGF0IGVudmlyb25tZW50LiovXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8qIFhYWCBtb2R1bGUgZXhwb3J0cyBmYWlsIGlmIHRoZXNlIGFyZW4ndCBpbiBzY29wZSovXG4vKiogQGltcG9ydCB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucywgRGV0YWlscywgR2VuZXJpY0Vycm9yQ29uc3RydWN0b3J9IGZyb20gJ3NlcycgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANPpRggQRwAAEEcAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEBpbXBvcnQgeyBIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yLCBSZW1vdGFibGVCcmFuZCwgQ2FsbGFibGUsIFNldHRsZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxufTtcblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjaXBpZW50IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbiAgICAgICAgICAvKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuICAgICAgICAgIC8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4gICAgICAgICAgLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuICAgICAgICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPHVua25vd24+fSAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgIC8qIFJlamVjdCB0aGUgYXN5bmMgZnVuY3Rpb24gY2FsbCovXG4gICAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgbWFrZUVycm9yKFxuICAgICAgICAgICAgICAgICAgWGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwcm9wZXJ0eUtleSl9XCIgbWV0aG9kIG9mIEUoJHtxKFxuICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQsXG4gICAgICAgICAgICAgICAgICApfSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIG1ldGhvZC1jYWxsKi9cbiAgICAgICAgICAgICAgLyogbWVzc2FnZSwqL1xuICAgICAgICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbiAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdBcnJheSk7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgICAgLyogV2UganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuc2VuZE9ubHkoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWNpcGllbnQgQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPHVua25vd24+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4gICAgICAgICAgLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbiAgICAgICAgICAvKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuICAgICAgICAgIC8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbiAgICAgICAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gdW5kZWZpbmVkfSAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwqL1xuICAgICAgICAgICAgICAvKiBtZXNzYWdlLCovXG4gICAgICAgICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIGZ1bmN0aW9uLWNhbGwgbWVzc2FnZSwqL1xuICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLmdldCh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXIgPSAoeCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQoeCwgcHJvcCksXG4gIH0pO1xuXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLyoqXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBvYmpUYXJnZXQgPSBmcmVlemUoeyBfX3Byb3RvX186IG51bGwgfSk7XG5cbi8qKlxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZVxuICogbWV0aG9kIGNhbGxzIHJldHVybnMgYSBwcm9taXNlLiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlclxuICogJ3gnIGRlc2lnbmF0ZXMgKG9yIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQW4gZXhhbXBsZSBjYWxsIHdvdWxkIGJlXG4gKlxuICogRSh6b2UpLmluc3RhbGwoYnVuZGxlKVxuICogICAudGhlbihpbnN0YWxsYXRpb25IYW5kbGUgPT4geyAuLi4gfSlcbiAqICAgLmNhdGNoKGVyciA9PiB7IC4uLiB9KTtcbiAqXG4gKiAgU2VlIGh0dHBzOi8vZW5kb2pzLmdpdGh1Yi5pby9lbmRvL2Z1bmN0aW9ucy9fZW5kb19mYXIuRS5odG1sIGZvciBkZXRhaWxzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgIHggPT4gbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFUHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG4gICAgICB7XG4gICAgICAgIC8qKlxuICogRS5nZXQoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gZ2V0IGFyYml0cmFyeSBwcm9wZXJ0aWVzLlxuICogRWFjaCBvZiB0aGVzZSBwcm9wZXJ0aWVzIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcHJvcGVydHkuICBUaGUgcHJvbWlzZVxuICogdmFsdWUgd2lsbCBiZSB0aGUgcHJvcGVydHkgZmV0Y2hlZCBmcm9tIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvclxuICogcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgcHJvcGVydHkgZ2V0XG4gKiBAcmV0dXJucyB7RUdldHRlcnM8TG9jYWxSZWNvcmQ8VD4+fSBwcm9wZXJ0eSBnZXQgcHJveHlcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVkZWYqL1xuICAgICAgICBnZXQ6IHggPT4gbmV3IFByb3h5KG9ialRhcmdldCwgbWFrZUVHZXRQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKipcbiAqIEUucmVzb2x2ZSh4KSBjb252ZXJ0cyB4IHRvIGEgaGFuZGxlZCBwcm9taXNlLiBJdCBpc1xuICogc2hvcnRoYW5kIGZvciBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gaGFuZGxlZCBwcm9taXNlIGZvciB4XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICByZXNvbHZlOiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlLFxuXG4gICAgICAgIC8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgICAgICBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvXG4gKiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ocmVzLCByZWopXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVSA9IFRdXG4gKiBAcGFyYW0ge1R8UHJvbWlzZUxpa2U8VD59IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IEVSZWY8VT59IFtvbmZ1bGZpbGxlZF1cbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiBFUmVmPFU+fSBbb25yZWplY3RlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFU+fVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxtYWtlRT59IEVQcm94eSAqL1xuXG4vKipcbiAqIERlY2xhcmUgYW4gb2JqZWN0IHRoYXQgaXMgcG90ZW50aWFsbHkgYSBmYXIgcmVmZXJlbmNlIG9mIHR5cGUgUHJpbWFyeSB3aG9zZVxuICogYXV4aWxsaWFyeSBkYXRhIGhhcyB0eXBlIExvY2FsLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBjb25zdW1lcnMgb2ZcbiAqIEZhciBvYmplY3RzIGluIGFyZ3VtZW50cyBhbmQgZGVjbGFyYXRpb25zOyB0aGUgb25seSBjcmVhdG9ycyBvZiBGYXIgb2JqZWN0c1xuICogYXJlIGRpc3RyaWJ1dGVkIG9iamVjdCBjcmVhdG9yIGNvbXBvbmVudHMgbGlrZSB0aGUgYEZhcmAgb3IgYFJlbW90YWJsZWBcbiAqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgUHJpbWFyeSBUaGUgdHlwZSBvZiB0aGUgcHJpbWFyeSByZWZlcmVuY2UuXG4gKiBAdGVtcGxhdGUgW0xvY2FsPURhdGFPbmx5PFByaW1hcnk+XSBUaGUgbG9jYWwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LlxuICogQHR5cGVkZWYge0VSZWY8TG9jYWwgJiBSZW1vdGFibGVCcmFuZDxMb2NhbCwgUHJpbWFyeT4+fSBGYXJSZWZcbiAqL1xuXG4vKipcbiAqIGBEYXRhT25seTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgcmVjb3JkIHR5cGUgYFQyYCBjb25zaXN0aW5nIG9ubHkgb2ZcbiAqIHByb3BlcnRpZXMgdGhhdCBhcmUgKm5vdCogZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIHRvIGJlIGZpbHRlcmVkLlxuICogQHR5cGVkZWYge09taXQ8VCwgRmlsdGVyZWRLZXlzPFQsIENhbGxhYmxlPj59IERhdGFPbmx5XG4gKi9cblxuLyoqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMzk0fVxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlTGlrZTxUPiB8IFR9IEVSZWZcbiAqIERlY2xhcmUgdGhhdCBgVGAgbWF5IG9yIG1heSBub3QgYmUgYSBQcm9taXNlLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvclxuICogY29uc3VtZXJzIG9mIGFyZ3VtZW50cyBhbmQgZGVjbGFyYXRpb25zOyByZXR1cm4gdmFsdWVzIHNob3VsZCBzcGVjaWZpY2FsbHkgYmVcbiAqIGBQcm9taXNlPFQ+YCBvciBgVGAgaXRzZWxmLlxuICovXG5cbi8qKlxuICogVGhlIGF3YWl0ZWQgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbi5cbiAqIEZvciB0aGUgZXZlbnR1YWwgcmVzdWx0IG9mIGFuIEUgY2FsbCwgQHNlZSB7RVJlc3VsdH0gb3IgQHNlZSB7RUNhbGxhYmxlUmV0dXJufVxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBpbmZlciBSID8gQXdhaXRlZDxSPiA6IG5ldmVyfSBFUmV0dXJuXG4gKi9cblxuLyoqXG4gKiBBbiBldmVudHVhbCB2YWx1ZSB3aGVyZSByZW1vdGFibGUgb2JqZWN0cyBhcmUgcmVjdXJzaXZlbHkgbWFwcGVkIHRvIFJlbW90ZSB0eXBlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QXdhaXRlZDxUPn0gRVJlc3VsdFxuICovXG5cbi8qKlxuICogRXhwZXJpbWVudGFsIHR5cGUgbWFwcGluZyByZW1vdGFibGUgb2JqZWN0cyB0byBSZW1vdGUgdHlwZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgMCBleHRlbmRzICgxICYgVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgVCBpcyBhbnlcbiAqICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBhbnkgdHlwZSB0aHJvdWdoIHRoZSByZXN1bHRcbiAqICAgICA6IFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBQPiAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIFJlbW90YWJsZVxuICogICAgICAgPyAoUCB8IFJlbW90YWJsZUJyYW5kPEwsIFA+KSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAgaXQgdG8gaXRzIFwibWF5YmUgcmVtb3RlXCIgZm9ybSAocHJpbWFyeSBiZWhhdmlvciBvciByZW1vdGFibGUgcHJlc2VuY2UpXG4gKiAgICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgICAgID8gUHJvbWlzZTxFQXdhaXRlZFJlc3VsdDxBd2FpdGVkPFQ+Pj4gICAgICAgICAgICAgIC8vIG1hcCBpdHMgcmVzb2x1dGlvblxuICogICAgICAgICA6IFQgZXh0ZW5kcyAobnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzeW1ib2wgfCBiaWdpbnQgfCBDYWxsYWJsZSkgLy8gSW50ZXJzZWN0aW9ucyBvZiB0aGVzZSB0eXBlcyB3aXRoIG9iamVjdHMgYXJlIG5vdCBtYXBwZWRcbiAqICAgICAgICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlcyBhbmQgbm9uLXJlbW90YWJsZSBmdW5jdGlvbnMgYXJlIHBhc3NlZC10aHJvdWdoXG4gKiAgICAgICAgICAgOiBUIGV4dGVuZHMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gKiAgICAgICAgICAgICA/IHsgW1AgaW4ga2V5b2YgVF06IEVBd2FpdGVkUmVzdWx0PFRbUF0+OyB9ICAgIC8vIG90aGVyIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgY29weSBkYXRhIGFuZCBwcm9wZXJ0aWVzIG1hcHBlZFxuICogICAgICAgICAgICAgOiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIGFueXRoaW5nIHdhc24ndCBjb3ZlcmVkLCBmYWxsYmFjayB0byBwYXNzLXRocm91Z2hcbiAqICl9IEVBd2FpdGVkUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBUaGUgQHNlZSB7RVJlc3VsdH0gcmV0dXJuIHR5cGUgb2YgYSByZW1vdGUgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgMCBleHRlbmRzICgxICYgVCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYW55XG4gKiAgICAgPyBhbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGFueSB0eXBlIHRocm91Z2ggdGhlIHJlc3VsdFxuICogICAgIDogVCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gaW5mZXIgUiAgLy8gRWxzZSBpbmZlciB0aGUgcmV0dXJuIHR5cGVcbiAqICAgICAgID8gRVJlc3VsdDxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUsIG1hcCB0aGUgZXZlbnR1YWwgcmVzdWx0XG4gKiAgICAgICA6IG5ldmVyXG4gKiApfSBFQ2FsbGFibGVSZXR1cm5cbiAqL1xuXG4vKiBUT0RPOiBGaWd1cmUgb3V0IGEgd2F5IHRvIG1hcCBnZW5lcmljIGNhbGxhYmxlIHJldHVybiB0eXBlcywgb3IgYXQgbGVhc3QgYmV0dGVyIGRldGVjdCB0aGVtLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy82MTgzOC4gV2l0aG91dCB0aGF0LCBgRShzdGFydEdvdmVybmVkVXBncmFkYWJsZSlgKi9cbi8qIGluIGFnb3JpYy1zZGsgZG9lc24ndCBwcm9wYWdhdGUgdGhlIHN0YXJ0IGZ1bmN0aW9uIHR5cGUuKi9cbi8qKlxuICogTWFwcyBhIGNhbGxhYmxlIHRvIGl0cyByZW1vdGVseSBjYWxsZWQgdHlwZVxuICpcbiAqIEB0ZW1wbGF0ZSB7Q2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgICBSZXR1cm5UeXBlPFQ+IGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjYWxsYWJsZSByZXR1cm5zIGEgcHJvbWlzZVxuICogICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnlwYXNzIG1hcHBpbmcgdG8gbWFpbnRhaW4gYW55IGdlbmVyaWNcbiAqICAgICAgOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxFQ2FsbGFibGVSZXR1cm48VD4+IC8vIE1hcCBpdCBhbnl3YXkgdG8gZW5zdXJlIHByb21pc2UgcmV0dXJuIHR5cGVcbiAqICl9IEVDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IFRbUF1cbiAqICAgICA6IFByb21pc2U8QXdhaXRlZDxUW1BdPj47XG4gKiB9fSBFR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPHZvaWQ+fSBFU2VuZE9ubHlDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVTZW5kT25seU1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFQ+ICYgRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IDAgZXh0ZW5kcyAoMSAmIFQpXG4gKiAgICAgICA/IG5ldmVyXG4gKiAgICAgICA6IEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFQ+ICYgRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiAwIGV4dGVuZHMgKDEgJiBUKVxuICogICAgICAgPyBuZXZlclxuICogICAgICAgOiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogUmV0dXJuIGEgdW5pb24gb2YgcHJvcGVydHkgbmFtZXMvc3ltYm9scy9udW1iZXJzIFAgZm9yIHdoaWNoIHRoZSByZWNvcmQgZWxlbWVudCBUW1BdJ3MgdHlwZSBleHRlbmRzIFUuXG4gKlxuICogR2l2ZW4gY29uc3QgeCA9IHsgYTogMTIzLCBiOiAnaGVsbG8nLCBjOiA0MiwgNDk6ICgpID0+IHt9LCA1MzogNjcgfSxcbiAqXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIG51bWJlcj4gaXMgdGhlIHR5cGUgJ2EnIHwgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIHN0cmluZz4gaXMgdGhlIHR5cGUgJ2InLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCA0MiB8IDY3PiBpcyB0aGUgdHlwZSAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgYm9vbGVhbj4gaXMgdGhlIHR5cGUgbmV2ZXIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAdHlwZWRlZiB7eyBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFUgPyBQIDogbmV2ZXI7IH1ba2V5b2YgVF19IEZpbHRlcmVkS2V5c1xuICovXG5cbi8qKlxuICogYFBpY2tDYWxsYWJsZTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgc2luZ2xlIHJvb3QgY2FsbGFibGUgb3IgYSByZWNvcmQgdHlwZVxuICogY29uc2lzdGluZyBvbmx5IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+ICAgICAgICAgICAgICAgICAgICAgLy8gYSByb290IGNhbGxhYmxlLCBubyBtZXRob2RzXG4gKiAgICAgOiBQaWNrPFQsIEZpbHRlcmVkS2V5czxULCBDYWxsYWJsZT4+ICAgICAgICAgIC8vIGFueSBjYWxsYWJsZSBtZXRob2RzXG4gKiApfSBQaWNrQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIGBSZW1vdGVGdW5jdGlvbnM8VD5gIG1lYW5zIHRvIHJldHVybiB0aGUgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlbW90ZWx5IGNhbGxhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj4gICAvLyBpZiBhIGdpdmVuIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIGNhbGxhYmxlIHByb3BlcnRpZXMgb2YgUlxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgICA/IFJlbW90ZUZ1bmN0aW9uczxVPiAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIHJlc29sdmVkIHZhbHVlIG9mIFRcbiAqICAgICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXR1cm4gVFxuICogKX0gUmVtb3RlRnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+XG4gKiAgICAgPyBMXG4gKiAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IExvY2FsUmVjb3JkPFU+XG4gKiAgICAgOiBUXG4gKiApfSBMb2NhbFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtSID0gdW5rbm93bl1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHByb21pc2U6IFByb21pc2U8Uj47XG4gKiAgIHNldHRsZXI6IFNldHRsZXI8Uj47XG4gKiB9fSBFUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVjbGFyZSBhIG5lYXIgb2JqZWN0IHRoYXQgbXVzdCBvbmx5IGJlIGludm9rZWQgd2l0aCBFLCBldmVuIGxvY2FsbHkuICBJdFxuICogc3VwcG9ydHMgdGhlIGBUYCBpbnRlcmZhY2UgYnV0IGFkZGl0aW9uYWxseSBwZXJtaXRzIGBUYCdzIG1ldGhvZHMgdG8gcmV0dXJuXG4gKiBgUHJvbWlzZUxpa2VgcyBldmVuIGlmIGBUYCBkZWNsYXJlcyB0aGVtIGFzIG9ubHkgc3luY2hyb25vdXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFQ+Pj4+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZT5cbiAqICAgICA/IHtcbiAqICAgICAgICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgICAgICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFRbS10+Pj4+XG4gKiAgICAgICAgICAgOiBUW0tdO1xuICogICAgICAgfVxuICogICAgIDogVFxuICogKX0gRU9ubHlcbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHOVMVJyFAAAchQAACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBnZXRQcm90b3R5cGVPZiwgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mID0gc3BlY2ltZW4gPT4gKHNwZWNpbWVuID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHNwZWNpbWVuKTtcblxuY29uc3Qgb25EZWxpdmVyeSA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19ERUxJVkVSWV9CUkVBS1BPSU5UUycpO1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCBgaXNQcmltaXRpdmVgIHRoYXQncyBjdXJyZW50bHkgaW4gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICogTGF5ZXJpbmcgY29uc3RyYWludHMgbWFrZSB0aGlzIHRyaWNreSwgd2hpY2ggaXMgd2h5IHdlIGhhdmVuJ3QgeWV0IGZpZ3VyZWRcbiAqIG91dCBob3cgdG8gZG8gdGhpcy5cbiAqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzICh1bmRlZmluZWRcbiAqIHwgbnVsbFxuICogfCBib29sZWFuXG4gKiB8IG51bWJlclxuICogfCBiaWdpbnRcbiAqIHwgc3RyaW5nXG4gKiB8IHN5bWJvbCl9XG4gKi9cbmNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIFByaW9yaXRpemUgc3ltYm9scyBhcyBlYXJsaWVyIHRoYW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZCA9IChhLCBiKSA9PiB7XG4gIGlmICh0eXBlb2YgYSA9PT0gdHlwZW9mIGIpIHtcbiAgICBjb25zdCBsZWZ0ID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHJpZ2h0ID0gU3RyaW5nKGIpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG4gICAgcmV0dXJuIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBhID09PSAnc3ltYm9sJykge1xuICAgIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N0cmluZycpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBhc3NlcnQodHlwZW9mIGEgPT09ICdzdHJpbmcnKTtcbiAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3ltYm9sJyk7XG4gIHJldHVybiAxO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PiB7XG4gIGxldCBsYXllciA9IHZhbDtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7IC8qIFNldCB0byBkZWR1cGxpY2F0ZSovXG4gIHdoaWxlIChsYXllciAhPT0gbnVsbCAmJiBsYXllciAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuICAgICAgLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbiAgICAgIGlmICh0eXBlb2YgdmFsW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vKiBUaGUgdG9wIGxldmVsIG9mIHRoZSBldmVudHVhbCBzZW5kIG1vZHVsZXMgY2FuIGJlIGV2YWx1YXRlZCBiZWZvcmUqL1xuLyogc2VzIGNyZWF0ZXMgYGhhcmRlbmAsIGFuZCBzbyBjYW5ub3QgcmVseSBvbiBgaGFyZGVuYCBhdCB0b3AgbGV2ZWwuKi8kaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgIGRlYnVnZ2VyOyAvKiBTVEVQIElOVE8gQVBQTFkqL1xuICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgZnVuY3Rpb24gY2FsbCovXG4gICAgLyogc28gdGhhdCB5b3UgY2FuIHN0ZXAgKmludG8qIHRoZSBmb2xsb3dpbmcgYGFwcGx5YCBpbiBvcmRlciB0byBzZWUgdGhlKi9cbiAgICAvKiBmdW5jdGlvbiBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuICAgIC8qIGFmdGVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMuKi9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8qIEJhc2UgY2FzZTsgYm90dG9tIG91dCB0byBhcHBseSBmdW5jdGlvbnMuKi9cbiAgICByZXR1cm4gbG9jYWxBcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJncyk7XG4gIH1cbiAgaWYgKHJlY2lwaWVudCA9PT0gdW5kZWZpbmVkIHx8IHJlY2lwaWVudCA9PT0gbnVsbCkge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgZGVsaXZlciAke3EobWV0aG9kTmFtZSl9IHRvIHRhcmdldDsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG4gICAgICAgIG50eXBlb2YocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZuID0gcmVjaXBpZW50W21ldGhvZE5hbWVdO1xuICBpZiAoZm4gPT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGB0YXJnZXQgaGFzIG5vIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9LCBoYXMgJHtxKFxuICAgICAgICBnZXRNZXRob2ROYW1lcyhyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZnR5cGUgPSBudHlwZW9mKGZuKTtcbiAgdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nIHx8XG4gICAgRmFpbGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9IGlzIG5vdCBhIGZ1bmN0aW9uOyBpdCBpcyBhICR7cShcbiAgICAgIGZ0eXBlLFxuICAgICl9YDtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgbWV0aG9kTmFtZSkpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgIGRlYnVnZ2VyOyAvKiBTVEVQIElOVE8gQVBQTFkqL1xuICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgbWV0aG9kIGNhbGwqL1xuICAgIC8qIHNvIHRoYXQgeW91IGNhbiBzdGVwICppbnRvKiB0aGUgZm9sbG93aW5nIGBhcHBseWAgaW4gb3JkZXIgdG8gc2VlIHRoZSovXG4gICAgLyogbWV0aG9kIGNhbGwgYXMgaXQgaGFwcGVucy4gT3Igc3RlcCAqb3ZlciogdG8gc2VlIHdoYXQgaGFwcGVucyovXG4gICAgLyogYWZ0ZXIgdGhlIG1ldGhvZCBjYWxsIHJldHVybnMuKi9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh3iIufQYAAD0GAAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoU3RyaW5nVGFnXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSByZWNpcGllbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIHZhbHVlIG9mIGEgcmVjaXBpZW50J3MgYEBAdG9TdHJpbmdUYWdgXG4gKiAgIGFmdGVyIHN0cmlwcGluZyBvdXQgYW55IGxlYWRpbmcgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqICAgcHJlZml4LiBGb3Igb2JqZWN0cyBkZWZpbmVkIHdpdGggYEZhcmAgdGhpcyBpcyB0aGUgZmlyc3QgYXJndW1lbnQsXG4gKiAgIGtub3duIGFzIHRoZSBgZmFyTmFtZWAuIEZvciBleG9zLCB0aGlzIGlzIHRoZSB0YWcuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8ICcqJ30gTWF0Y2hNZXRob2ROYW1lXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSBtZXRob2QgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIGlzXG4gKiAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgbWV0aG9kIG5hbWUuIEN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGFuIGV4YWN0IG1hdGNoLlxuICogICBIb3dldmVyLCBiZXdhcmUgdGhhdCB3ZSBtYXkgaW50cm9kdWNlIGEgc3RyaW5nIHN5bnRheCBmb3JcbiAqICAgc3ltYm9sIG1ldGhvZCBuYW1lcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7bnVtYmVyIHwgJyonfSBNYXRjaENvdW50ZG93blxuICogICBBIHN0YXIgYCcqJ2Agd2lsbCBhbHdheXMgYnJlYWtwb2ludC4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nXG4gKiAgIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gT25jZSB0aGF0IGlzIHplcm8sIGFsd2F5cyBicmVha3BvaW50LlxuICogICBPdGhlcndpc2UgZGVjcmVtZW50IGJ5IG9uZSBlYWNoIHRpbWUgaXQgbWF0Y2hlcyB1bnRpbCBpdCByZWFjaGVzIHplcm8uXG4gKiAgIEluIG90aGVyIHdvcmRzLCB0aGUgY291bnRkb3duIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZlxuICogICBicmVha3BvaW50IG9jY3VycmVuY2VzIHRvIHNraXAgYmVmb3JlIGFjdHVhbGx5IGJyZWFrcG9pbnRpbmcuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBleHRlcm5hbCBKU09OIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaFxuICogLSB0aGUgb3V0ZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgY2xhc3MtbGlrZSB0YWcgb3IgJyonLFxuICogLSB0aGUgaW5uZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgb3IgJyonLFxuICogLSB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudGRvd24gb3IgJyonLlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8TWF0Y2hTdHJpbmdUYWcsIFJlY29yZDxNYXRjaE1ldGhvZE5hbWUsIE1hdGNoQ291bnRkb3duPj59IE1lc3NhZ2VCcmVha3BvaW50c1xuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgaW50ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoTWV0aG9kTmFtZSwgUmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBNYXRjaENvdW50ZG93bj4+fSBCcmVha3BvaW50VGFibGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IE1lc3NhZ2VCcmVha3BvaW50c30gZ2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KG5ld0JyZWFrcG9pbnRzPzogTWVzc2FnZUJyZWFrcG9pbnRzKSA9PiB2b2lkfSBzZXRCcmVha3BvaW50c1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlY2lwaWVudDogb2JqZWN0LFxuICogICBtZXRob2ROYW1lOiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWRcbiAqICkgPT4gYm9vbGVhbn0gc2hvdWxkQnJlYWtwb2ludFxuICovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qKlxuICogUmV0dXJuIGB0YWdgIGFmdGVyIHN0cmlwcGluZyBvZmYgYW55IGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiBwcmVmaXggaWYgcHJlc2VudC5cbiAqIGBgYGpzXG4gKiBzaW1wbGlmeVRhZygnQWxsZWdlZDogbW9vbGEgaXNzdWVyJykgPT09ICdtb29sYSBpc3N1ZXInXG4gKiBgYGBcbiAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWNoIHByZWZpeGVzLCBvbmx5IHRoZSBvdXRlciBvbmUgaXMgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzaW1wbGlmeVRhZyA9IHRhZyA9PiB7XG4gIGZvciAoY29uc3QgcHJlZml4IG9mIFsnQWxsZWdlZDogJywgJ0RlYnVnTmFtZTogJ10pIHtcbiAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIHRhZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhZztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEByZXR1cm5zIHtNZXNzYWdlQnJlYWtwb2ludFRlc3RlciB8IHVuZGVmaW5lZH1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbiAgICBjb25zdCBuZXdCcmVha3BvaW50c1RhYmxlID0geyBfX3Byb3RvX186IG51bGwgfTtcblxuICAgIGZvciAoY29uc3QgW3RhZywgbWV0aG9kQlBzXSBvZiBlbnRyaWVzKG5ld0JyZWFrcG9pbnRzKSkge1xuICAgICAgdGFnID09PSBzaW1wbGlmeVRhZyh0YWcpIHx8XG4gICAgICAgIEZhaWxgSnVzdCB1c2Ugc2ltcGxlIHRhZyAke3Eoc2ltcGxpZnlUYWcodGFnKSl9IHJhdGhlciB0aGFuICR7cSh0YWcpfWA7XG4gICAgICBpc0pTT05SZWNvcmQobWV0aG9kQlBzKSB8fFxuICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgKX0gdG8gYmUgYSBKU09OIG1ldGhvZHMgYnJlYWtwb2ludHMgcmVjb3JkYDtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIGNvdW50XSBvZiBlbnRyaWVzKG1ldGhvZEJQcykpIHtcbiAgICAgICAgY291bnQgPT09ICcqJyB8fFxuICAgICAgICAgICh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudCkgJiZcbiAgICAgICAgICAgIGNvdW50ID49IDApIHx8XG4gICAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cSh0YWcpfS4ke3EoXG4gICAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgICl9IHRvIGJlIFwiKlwiIG9yIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzQlBzID0gaGFzT3duKG5ld0JyZWFrcG9pbnRzVGFibGUsIG1ldGhvZE5hbWUpXG4gICAgICAgICAgPyBuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdXG4gICAgICAgICAgOiAobmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSA9IHtcbiAgICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvKiBUT0RPIGVuYWJsZSBmdW5jdGlvbiBicmVha3BvaW50aW5nKi9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NCUHMgPSBicmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdIHx8IGJyZWFrcG9pbnRzVGFibGVbJyonXTtcbiAgICBpZiAoY2xhc3NCUHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgdGFnID0gc2ltcGxpZnlUYWcocmVjaXBpZW50W1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICAgIGxldCBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhZyA9ICcqJztcbiAgICAgIGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhc3NlcnQodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJiBjb3VudCA+PSAxKTtcbiAgICBjbGFzc0JQc1t0YWddID0gY291bnQgLSAxO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgZnJlZXplKHNob3VsZEJyZWFrcG9pbnQpO1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRUZXN0ZXIgPSBmcmVlemUoe1xuICAgIGdldEJyZWFrcG9pbnRzLFxuICAgIHNldEJyZWFrcG9pbnRzLFxuICAgIHNob3VsZEJyZWFrcG9pbnQsXG4gIH0pO1xuICBicmVha3BvaW50VGVzdGVyLnNldEJyZWFrcG9pbnRzKCk7XG4gIHJldHVybiBicmVha3BvaW50VGVzdGVyO1xufTskaM2PX29uY2UubWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG5mcmVlemUobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKRNV2dYFAADWBQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUU7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChtYWtlRSA9ICRozY9fYSldXV1dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTtcblxuLyogWFhYIG1vZHVsZSBleHBvcnRzIGZvciBIYW5kbGVkUHJvbWlzZSBmYWlsIGlmIHRoZXNlIGFyZW4ndCBpbiBzY29wZSovXG4vKiogQGltcG9ydCB7SGFuZGxlciwgSGFuZGxlZEV4ZWN1dG9yfSBmcm9tICcuL2hhbmRsZWQtcHJvbWlzZS5qcycgKi9cbi8qKiBAaW1wb3J0IHtFQ2FsbGFibGVPck1ldGhvZHMsIEVHZXR0ZXJzLCBFUmVmLCBFUmVtb3RlRnVuY3Rpb25zLCBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kcywgTG9jYWxSZWNvcmQsIFJlbW90ZUZ1bmN0aW9uc30gZnJvbSAnLi9FLmpzJyAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZSBtZXRob2QgY2FsbHMgcmV0dXJucyBhIHByb21pc2UuXG4gKiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3IgcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuIEVhY2ggb2YgdGhlc2UgcHJvcGVydGllcyByZXR1cm5zIGFcbiAqIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlIHZhbHVlIHdpbGwgYmUgdGhlIHByb3BlcnR5IGZldGNoZWQgZnJvbSB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3JcbiAqIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAzKKSOVxIAAFcSAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBXZSBhbHNvIGNhbm5vdCBjdXJyZW50bHkgaW1wb3J0IHRoZW0gYmVjYXVzZSBpdCB3b3VsZCBjcmVhdGUgYSBjeWNsaWMqL1xuLyogZGVwZW5kZW5jeSwgdGhvdWdoIHRoaXMgaXMgbW9yZSBlYXNpbHkgZml4ZWQuKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgWCwgRmFpbCB9IGZyb20gJ0BlbmRvL2Vycm9ycyc7Ki9cbi8qIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOTUxNSovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBFTkFCTEVEID1cbiAgLyoqIEB0eXBlIHsnZGlzYWJsZWQnIHwgJ2VuYWJsZWQnfSAqL1xuICAoZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMsIHJldHVybnMgYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMgd2hvc2VcbiAqIGB0aGlzYC1mcmVlIGNhbGwgYmVoYXZpb3JzIGFyZSBub3Qgb2JzZXJ2YWJseSBkaWZmZXJlbnQgdG8gdGhvc2UgdGhhdFxuICogY2Fubm90IHNlZSBjb25zb2xlIG91dHB1dC4gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBjYXVzZSBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIGNhbGwgdG8gYHRyYWNrVHVybnNgIGlzIGl0c2VsZiBhIHNlbmRpbmcgZXZlbnQsIHRoYXQgb2NjdXJzIGluIHNvbWUgY2FsbFxuICogc3RhY2sgaW4gc29tZSB0dXJuIG51bWJlciBhdCBzb21lIGV2ZW50IG51bWJlciB3aXRoaW4gdGhhdCB0dXJuLiBFYWNoIGNhbGxcbiAqIHRvIGFueSBvZiB0aGUgcmV0dXJuZWQgYFR1cm5TdGFydEZuYHMgaXMgYSByZWNlaXZpbmcgZXZlbnQgdGhhdCBiZWdpbnMgYSBuZXdcbiAqIHR1cm4uIFRoaXMgc2VuZGluZyBldmVudCBjYXVzZWQgZWFjaCBvZiB0aG9zZSByZWNlaXZpbmcgZXZlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICpcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxF2aNgAgAAYAIAABoAAABAZW5kby9leG8tdjEuNS4xMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9leG8tbWFrZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvZ2V0LWludGVyZmFjZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2dldC1pbnRlcmZhY2UuanMiOltbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiLCJHRVRfSU5URVJGQUNFX0dVQVJEIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACxkxD/ECAAABAgAAAjAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyIsIi4vZXhvLXRvb2xzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxGYWlsLHEsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9leG8tdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRozY9fYSldXSxbXCJkZWZlbmRQcm90b3R5cGVLaXRcIixbJGjNj19hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QW1wbGlmeSwgRXhvQ2xhc3NLaXRNZXRob2RzLCBFeG9DbGFzc01ldGhvZHMsIEZhckNsYXNzT3B0aW9ucywgR3VhcmRlZCwgR3VhcmRlZEtpdCwgRXhvQ2xhc3NJbnRlcmZhY2VHdWFyZEtpdCwgSXNJbnN0YW5jZSwgS2l0Q29udGV4dCwgRXhvQ2xhc3NJbnRlcmZhY2VHdWFyZCwgTWV0aG9kcywgRmFjZXROYW1lfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgc2VhbCwgZnJlZXplLCBkZWZpbmVQcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qIFR1cm4gb24gdG8gZ2l2ZSBlYWNoIGV4byBpbnN0YW5jZSBpdHMgb3duIHRvU3RyaW5nVGFnIHZhbHVlLiovXG5jb25zdCBMQUJFTF9JTlNUQU5DRVMgPSBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsICdsYWJlbC1pbnN0YW5jZXMnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHByb3RvXG4gKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VDb3VudFxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1ha2VTZWxmID0gKHByb3RvLCBpbnN0YW5jZUNvdW50KSA9PiB7XG4gIGNvbnN0IHNlbGYgPSBjcmVhdGUocHJvdG8pO1xuICBpZiAoTEFCRUxfSU5TVEFOQ0VTKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoc2VsZiwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICB2YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihzZWxmKTtcbn07XG5cbmNvbnN0IGVtcHR5UmVjb3JkID0gaGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9leG9DbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbiAgICAgICBjb25zdCBpbml0RW1wdHkgPSAoKSA9PiBlbXB0eVJlY29yZDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJIGluaXQgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gTSBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0V4b0NsYXNzSW50ZXJmYWNlR3VhcmQ8TT4gfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7RXhvQ2xhc3NNZXRob2RzPE0sIEk+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZDxNPn1cbiAqLyRozY9fb25jZS5pbml0RW1wdHkoaW5pdEVtcHR5KTtcbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzcyA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZCxcbiAgaW5pdCxcbiAgbWV0aG9kcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzKTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIHJlY2VpdmVBbXBsaWZpZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgIEZhaWxgT25seSBmYWNldHMgb2YgYW4gZXhvIGNsYXNzIGtpdCBjYW4gYmUgYW1wbGlmaWVkICR7cSh0YWcpfWA7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwPE0sIElNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LCBNPj59ICovXG4gIGNvbnN0IGNvbnRleHRNYXAgPSBuZXcgV2Vha01hcCgpO1xuICBjb25zdCBwcm90byA9IGRlZmVuZFByb3RvdHlwZShcbiAgICB0YWcsXG4gICAgc2VsZiA9PiAvKiogQHR5cGUge2FueX0gKi8gKGNvbnRleHRNYXAuZ2V0KHNlbGYpKSxcbiAgICBtZXRob2RzLFxuICAgIHRydWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLyoqXG4gKiBAcGFyYW0gIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbiAgY29uc3QgbWFrZUluc3RhbmNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuXG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIC8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG4gICAgY29uc3QgY29udGV4dCA9IGZyZWV6ZSh7IHN0YXRlLCBzZWxmIH0pO1xuICAgIGNvbnRleHRNYXAuc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIGZpbmlzaChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgaWYgKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcikge1xuICAgIC8qKiBAdHlwZSB7SXNJbnN0YW5jZX0gKi9cbiAgICBjb25zdCBpc0luc3RhbmNlID0gKGV4bywgZmFjZXROYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmYWNldE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYGZhY2V0TmFtZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYW4gZXhvIGNsYXNzIGtpdDogJHtxKFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgKX0gaGFzIG5vIGZhY2V0ICR7cShmYWNldE5hbWUpfWA7XG4gICAgICByZXR1cm4gY29udGV4dE1hcC5oYXMoZXhvKTtcbiAgICB9O1xuICAgIGhhcmRlbihpc0luc3RhbmNlKTtcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIoaXNJbnN0YW5jZSk7XG4gIH1cblxuICByZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG59OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRiBmYWNldCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0V4b0NsYXNzSW50ZXJmYWNlR3VhcmRLaXQ8Rj4gfCB1bmRlZmluZWQgfSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge0V4b0NsYXNzS2l0TWV0aG9kczxGLCBJPn0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8XG4gKiAgIEtpdENvbnRleHQ8UmV0dXJuVHlwZTxJPiwgR3VhcmRlZEtpdDxGPj4sXG4gKiAgIEd1YXJkZWRLaXQ8Rj5cbiAqID59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkS2l0PEY+fVxuICovXG4gICAgICAgY29uc3QgZGVmaW5lRXhvQ2xhc3NLaXQgPSAoXG4gIHRhZyxcbiAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gIGluaXQsXG4gIG1ldGhvZHNLaXQsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBoYXJkZW4obWV0aG9kc0tpdCk7XG4gIGNvbnN0IHtcbiAgICBmaW5pc2ggPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUFtcGxpZmllciA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIgPSB1bmRlZmluZWQsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBjb250ZXh0TWFwS2l0ID0gb2JqZWN0TWFwKG1ldGhvZHNLaXQsICgpID0+IG5ldyBXZWFrTWFwKCkpO1xuICBjb25zdCBnZXRDb250ZXh0S2l0ID0gb2JqZWN0TWFwKFxuICAgIGNvbnRleHRNYXBLaXQsXG4gICAgY29udGV4dE1hcCA9PiBmYWNldCA9PiBjb250ZXh0TWFwLmdldChmYWNldCksXG4gICk7XG4gIGNvbnN0IHByb3RvdHlwZUtpdCA9IGRlZmVuZFByb3RvdHlwZUtpdChcbiAgICB0YWcsXG4gICAgZ2V0Q29udGV4dEtpdCxcbiAgICBtZXRob2RzS2l0LFxuICAgIHRydWUsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLyoqXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2VLaXQgPSAoLi4uYXJncykgPT4ge1xuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICBjb25zdCBzdGF0ZSA9IHNlYWwoaW5pdCguLi5hcmdzKSk7XG4gICAgLyogRG9uJ3QgZnJlZXplIGNvbnRleHQgdW50aWwgd2UgYWRkIGZhY2V0cyovXG4gICAgLyoqIEB0eXBlIHt7IHN0YXRlOiBSZXR1cm5UeXBlPEk+LCBmYWNldHM6IGFueSB9fSAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHN0YXRlLCBmYWNldHM6IG51bGwgfTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3QgZmFjZXRzID0gb2JqZWN0TWFwKHByb3RvdHlwZUtpdCwgKHByb3RvLCBmYWNldE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG4gICAgICBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSk7XG4gICAgY29udGV4dC5mYWNldHMgPSBmYWNldHM7XG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIGZyZWV6ZShjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiAvKiogQHR5cGUge0d1YXJkZWRLaXQ8Rj59ICovIChjb250ZXh0LmZhY2V0cyk7XG4gIH07XG5cbiAgaWYgKHJlY2VpdmVBbXBsaWZpZXIpIHtcbiAgICAvKiogQHR5cGUge0FtcGxpZnl9ICovXG4gICAgY29uc3QgYW1wbGlmeSA9IGV4b0ZhY2V0ID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29udGV4dE1hcCBvZiB2YWx1ZXMoY29udGV4dE1hcEtpdCkpIHtcbiAgICAgICAgaWYgKGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KSkge1xuICAgICAgICAgIGNvbnN0IHsgZmFjZXRzIH0gPSBjb250ZXh0TWFwLmdldChleG9GYWNldCk7XG4gICAgICAgICAgcmV0dXJuIGZhY2V0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgRmFpbGBNdXN0IGJlIGEgZmFjZXQgb2YgJHtxKHRhZyl9OiAke2V4b0ZhY2V0fWA7XG4gICAgfTtcbiAgICBoYXJkZW4oYW1wbGlmeSk7XG4gICAgcmVjZWl2ZUFtcGxpZmllcihhbXBsaWZ5KTtcbiAgfVxuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiogQHR5cGUge0lzSW5zdGFuY2V9ICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG9GYWNldCwgZmFjZXROYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoZmFjZXROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcyhjb250ZXh0TWFwS2l0KS5zb21lKGNvbnRleHRNYXAgPT5cbiAgICAgICAgICBjb250ZXh0TWFwLmhhcyhleG9GYWNldCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhc3NlcnQudHlwZW9mKGZhY2V0TmFtZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgY29udGV4dE1hcCA9IGNvbnRleHRNYXBLaXRbZmFjZXROYW1lXTtcbiAgICAgIGNvbnRleHRNYXAgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYGV4byBjbGFzcyBraXQgJHtxKHRhZyl9IGhhcyBubyBmYWNldCBuYW1lZCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KTtcbiAgICB9O1xuICAgIGhhcmRlbihpc0luc3RhbmNlKTtcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIoaXNJbnN0YW5jZSk7XG4gIH1cblxuICByZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG59OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzc0tpdChkZWZpbmVFeG9DbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3NLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmQ8e1xuICogICBbTSBpbiBrZXlvZiBUXTogSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLk1ldGhvZEd1YXJkXG4gKiB9PiB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PHt9LFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7R3VhcmRlZDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFeG8gPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgbWV0aG9kcywgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSBkZWZpbmVFeG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdEVtcHR5LFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xufTskaM2PX29uY2UubWFrZUV4byhtYWtlRXhvKTtcbmhhcmRlbihtYWtlRXhvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lRXhvQ2xhc3MiOlsiZGVmaW5lRXhvQ2xhc3MiXSwiZGVmaW5lRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRXhvQ2xhc3NLaXQiXSwibWFrZUV4byI6WyJtYWtlRXhvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABWj/usuRgAALkYAACIAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lcnJvcnMiLCIuL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGdldFJlbW90YWJsZU1ldGhvZE5hbWVzLHRvVGhyb3dhYmxlLEZhcixtdXN0TWF0Y2gsTSxpc0F3YWl0QXJnR3VhcmQsaXNSYXdHdWFyZCxnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCxnZXRNZXRob2RHdWFyZFBheWxvYWQsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGdldENvcHlNYXBFbnRyaWVzLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxxLEZhaWwsR0VUX0lOVEVSRkFDRV9HVUFSRDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRSZW1vdGFibGVNZXRob2ROYW1lcyA9ICRozY9fYSldXSxbXCJ0b1Rocm93YWJsZVwiLFskaM2PX2EgPT4gKHRvVGhyb3dhYmxlID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiaXNBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoaXNBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcImlzUmF3R3VhcmRcIixbJGjNj19hID0+IChpc1Jhd0d1YXJkID0gJGjNj19hKV1dLFtcImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIixbJGjNj19hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9nZXQtaW50ZXJmYWNlLmpzXCIsIFtbXCJHRVRfSU5URVJGQUNFX0dVQVJEXCIsWyRozY9fYSA9PiAoR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZCwgTWV0aG9kLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRQYXlsb2FkLCBEZWZhdWx0R3VhcmRUeXBlfSBmcm9tICdAZW5kby9wYXR0ZXJucydcbiAqIEBpbXBvcnQge0NsYXNzQ29udGV4dCwgQ29udGV4dFByb3ZpZGVyLCBGYWNldE5hbWUsIEtpdENvbnRleHQsIEtpdENvbnRleHRQcm92aWRlciwgTWF0Y2hDb25maWcsIE1ldGhvZHN9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtHZXRJbnRlcmZhY2VHdWFyZH0gZnJvbSAnLi9nZXQtaW50ZXJmYWNlLmpzJztcbiAqL1xuXG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzLCBmcm9tRW50cmllcywgaGFzT3duIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGRvZXMgbm90XG4gKiBlbmZvcmNlIGFueSBjb25zdHJhaW50cyBvZiBpbmNvbWluZyBhcmd1bWVudHMgb3IgcmV0dXJuIHJlc3VsdHMuXG4gKi9cbmNvbnN0IFJhd01ldGhvZEd1YXJkID0gTS5jYWxsKCkucmVzdChNLnJhdygpKS5yZXR1cm5zKE0ucmF3KCkpO1xuXG5jb25zdCBSRURBQ1RFRF9SQVdfQVJHID0gJzxyZWRhY3RlZCByYXcgYXJnPic7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGVuZm9yY2VzIG9ubHkgdGhhdFxuICogYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2FibGUgYW5kIHRoYXQgdGhlIHJlc3VsdCBpcyBwYXNzYWJsZS4gKEluIGZhciBjbGFzc2VzLFxuICogXCJhbnlcIiBtZWFucyBhbnkgKnBhc3NhYmxlKi4pIFRoaXMgaXMgdGhlIGxlYXN0IHBvc3NpYmxlIG5vbi1yYXdcbiAqIGVuZm9yY2VtZW50IGZvciBhIG1ldGhvZCBndWFyZCwgYW5kIGlzIGltcGxpZWQgYnkgYWxsIG90aGVyXG4gKiBub24tcmF3IG1ldGhvZCBndWFyZHMuXG4gKi9cbmNvbnN0IFBhc3NhYmxlTWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZVtdfSBzeW5jQXJnc1xuICogQHBhcmFtIHtNYXRjaENvbmZpZ30gbWF0Y2hDb25maWdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGVbXX0gUmV0dXJucyB0aGUgYXJncyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHJhdyBtZXRob2QuXG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNBcmdzID0gKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY2xhcmVkTGVuLFxuICAgIGhhc1Jlc3RBcmdHdWFyZCxcbiAgICByZXN0QXJnR3VhcmRJc1JhdyxcbiAgICBwYXJhbXNQYXR0ZXJuLFxuICAgIHJlZGFjdGVkSW5kaWNlcyxcbiAgfSA9IG1hdGNoQ29uZmlnO1xuXG4gIC8qIFVzZSBzeW5jQXJncyBpZiBwb3NzaWJsZSwgYnV0IGNvcHkgaXQgd2hlbiBuZWNlc3NhcnkgdG8gaW1wbGVtZW50Ki9cbiAgLyogcmVkYWN0aW9ucy4qL1xuICBsZXQgbWF0Y2hhYmxlQXJncyA9IHN5bmNBcmdzO1xuICBpZiAocmVzdEFyZ0d1YXJkSXNSYXcgJiYgc3luY0FyZ3MubGVuZ3RoID4gZGVjbGFyZWRMZW4pIHtcbiAgICBjb25zdCByZXN0TGVuID0gc3luY0FyZ3MubGVuZ3RoIC0gZGVjbGFyZWRMZW47XG4gICAgY29uc3QgcmVkYWN0ZWRSZXN0ID0gQXJyYXkocmVzdExlbikuZmlsbChSRURBQ1RFRF9SQVdfQVJHKTtcbiAgICBtYXRjaGFibGVBcmdzID0gWy4uLnN5bmNBcmdzLnNsaWNlKDAsIGRlY2xhcmVkTGVuKSwgLi4ucmVkYWN0ZWRSZXN0XTtcbiAgfSBlbHNlIGlmIChcbiAgICByZWRhY3RlZEluZGljZXMubGVuZ3RoID4gMCAmJlxuICAgIHJlZGFjdGVkSW5kaWNlc1swXSA8IHN5bmNBcmdzLmxlbmd0aFxuICApIHtcbiAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgYXJyYXksIGF2b2lkaW5nIGhhcmRlbmluZyB0aGUgcmVkYWN0ZWQgb25lcyAod2hpY2ggYXJlKi9cbiAgICAvKiB0cml2aWFsbHkgbWF0Y2hlZCB1c2luZyBSRURBQ1RFRF9SQVdfQVJHIGFzIGEgc2VudGluZWwgdmFsdWUpLiovXG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJnc107XG4gIH1cblxuICBmb3IgKGNvbnN0IGkgb2YgcmVkYWN0ZWRJbmRpY2VzKSB7XG4gICAgaWYgKGkgPj0gbWF0Y2hhYmxlQXJncy5sZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBtYXRjaGFibGVBcmdzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgfVxuXG4gIG11c3RNYXRjaChoYXJkZW4obWF0Y2hhYmxlQXJncyksIHBhcmFtc1BhdHRlcm4sIGxhYmVsKTtcblxuICBpZiAoaGFzUmVzdEFyZ0d1YXJkKSB7XG4gICAgcmV0dXJuIHN5bmNBcmdzO1xuICB9XG4gIHN5bmNBcmdzLmxlbmd0aCA8PSBkZWNsYXJlZExlbiB8fFxuICAgIEZhaWxgJHtxKGxhYmVsKX0gYWNjZXB0cyBhdCBtb3N0ICR7cShkZWNsYXJlZExlbil9IGFyZ3VtZW50cywgbm90ICR7cShcbiAgICAgIHN5bmNBcmdzLmxlbmd0aCxcbiAgICApfTogJHtzeW5jQXJnc31gO1xuICByZXR1cm4gc3luY0FyZ3M7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBtZXRob2QgZ3VhcmQgdG8gYSBtYXRjaCBjb25maWcgZm9yIG1vcmUgZWZmaWNpZW50IHBlci1jYWxsXG4gKiBleGVjdXRpb24uICBUaGlzIGlzIGEgb25lLXRpbWUgY29udmVyc2lvbiwgc28gaXQncyBPSyB0byBiZSBzbG93LlxuICpcbiAqIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSB0byBkZXRlY3QgYE0ucmF3KClgIHNvIHRoYXQgd2UgYnVpbGQgYSBtYXRjaCBwYXR0ZXJuXG4gKiBhbmQgbWV0YWRhdGEgaW5zdGVhZCBvZiBkb2luZyB0aGlzIGluIHRoZSBob3QgcGF0aC5cbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEByZXR1cm5zIHtNYXRjaENvbmZpZ31cbiAqL1xuY29uc3QgYnVpbGRNYXRjaENvbmZpZyA9IG1ldGhvZEd1YXJkUGF5bG9hZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG5cbiAgY29uc3QgbWF0Y2hhYmxlQXJnR3VhcmRzID0gWy4uLmFyZ0d1YXJkcywgLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG4gIGNvbnN0IHJlZGFjdGVkSW5kaWNlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSkpIHtcbiAgICAgIG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gICAgICByZWRhY3RlZEluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICAvKiBQYXNzIHRocm91Z2ggcmF3IHJlc3QgYXJndW1lbnRzIHdpdGhvdXQgbWF0Y2hpbmcuKi9cbiAgbGV0IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IHJlc3RBcmdHdWFyZDtcbiAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlUmVzdEFyZ0d1YXJkKSkge1xuICAgIG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IE0uYXJyYXlPZihSRURBQ1RFRF9SQVdfQVJHKTtcbiAgfVxuICBjb25zdCBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQgPSBoYXJkZW4oe1xuICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICBhcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZSgwLCBhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogbWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIHJlc3RBcmdHdWFyZDogbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICB9KTtcblxuICBjb25zdCBwYXJhbXNQYXR0ZXJuID0gTS5zcGxpdEFycmF5KFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5hcmdHdWFyZHMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLm9wdGlvbmFsQXJnR3VhcmRzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5yZXN0QXJnR3VhcmQsXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZGVjbGFyZWRMZW46IG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGgsXG4gICAgaGFzUmVzdEFyZ0d1YXJkOiByZXN0QXJnR3VhcmQgIT09IHVuZGVmaW5lZCxcbiAgICByZXN0QXJnR3VhcmRJc1JhdzogcmVzdEFyZ0d1YXJkICE9PSBtYXRjaGFibGVSZXN0QXJnR3VhcmQsXG4gICAgcGFyYW1zUGF0dGVybixcbiAgICByZWRhY3RlZEluZGljZXMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHsocmVwcmVzZW50YXRpdmU6IGFueSkgPT4gQ2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH0gZ2V0Q29udGV4dFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kID0gKFxuICBnZXRDb250ZXh0LFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICBsYWJlbCxcbikgPT4ge1xuICBjb25zdCB7IHJldHVybkd1YXJkIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGNvbnN0IGlzUmF3UmV0dXJuID0gaXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG4gIGNvbnN0IG1hdGNoQ29uZmlnID0gYnVpbGRNYXRjaENvbmZpZyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCB7IHN5bmNNZXRob2QgfSA9IHtcbiAgICAvKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbiAgICBzeW5jTWV0aG9kKC4uLnN5bmNBcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgLyogT25seSBoYXJkZW4gYXJncyBhbmQgcmV0dXJuIHZhbHVlIGlmIG5vdCBkZWFsaW5nIHdpdGggYSByYXcgdmFsdWUgZ3VhcmQuKi9cbiAgICAgICAgY29uc3QgcmVhbEFyZ3MgPSBkZWZlbmRTeW5jQXJncyhzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHkoYmVoYXZpb3JNZXRob2QsIGNvbnRleHQsIHJlYWxBcmdzKTtcbiAgICAgICAgaWYgKCFpc1Jhd1JldHVybikge1xuICAgICAgICAgIG11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKHRocm93blRoaW5nKSB7XG4gICAgICAgIHRocm93IHRvVGhyb3dhYmxlKHRocm93blRoaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc3luY01ldGhvZDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICovXG5jb25zdCBkZXN5bmMgPSBtZXRob2RHdWFyZFBheWxvYWQgPT4ge1xuICBjb25zdCB7XG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICAhaXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCkgfHxcbiAgICBGYWlsYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG4gIGNvbnN0IHJhd0FyZ0d1YXJkcyA9IFsuLi5hcmdHdWFyZHMsIC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuICBjb25zdCBhd2FpdEluZGV4ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdBcmdHdWFyZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBhcmdHdWFyZCA9IHJhd0FyZ0d1YXJkc1tpXTtcbiAgICBpZiAoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSkge1xuICAgICAgcmF3QXJnR3VhcmRzW2ldID0gZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkO1xuICAgICAgYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgYXdhaXRJbmRleGVzLFxuICAgIHJhd01ldGhvZEd1YXJkUGF5bG9hZDoge1xuICAgICAgLi4ubWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgYXJnR3VhcmRzOiByYXdBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIH0sXG4gIH07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuXG4gIGNvbnN0IHsgYXdhaXRJbmRleGVzLCByYXdNZXRob2RHdWFyZFBheWxvYWQgfSA9IGRlc3luYyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcocmF3TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuICBjb25zdCB7IGFzeW5jTWV0aG9kIH0gPSB7XG4gICAgLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4gICAgYXN5bmNNZXRob2QoLi4uYXJncykge1xuICAgICAgY29uc3QgYXdhaXRMaXN0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgYXdhaXRJbmRleGVzKSB7XG4gICAgICAgIGlmIChpID49IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXRMaXN0LnB1c2goYXJnc1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbiAgICAgIGNvbnN0IHN5bmNBcmdzID0gWy4uLmFyZ3NdO1xuICAgICAgY29uc3QgcmVzdWx0UCA9IEUud2hlbihcbiAgICAgICAgcCxcbiAgICAgICAgLyoqIEBwYXJhbSB7YW55W119IGF3YWl0ZWRBcmdzICovIGF3YWl0ZWRBcmdzID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF3YWl0ZWRBcmdzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzeW5jQXJnc1thd2FpdEluZGV4ZXNbal1dID0gYXdhaXRlZEFyZ3Nbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEdldCB0aGUgY29udGV4dCBhZnRlciBhbGwgd2FpdGluZyBpbiBjYXNlIHdlIGV2ZXIgZG8gcmV2b2NhdGlvbiovXG4gICAgICAgICAgLyogYnkgcmVtb3ZpbmcgdGhlIGNvbnRleHQgZW50cnkuIEF2b2lkIFRPQ1RUT1UhKi9cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgICBjb25zdCByZWFsQXJncyA9IGRlZmVuZFN5bmNBcmdzKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwpO1xuICAgICAgICAgIHJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCwgY29udGV4dCwgcmVhbEFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBFLndoZW4ocmVzdWx0UCwgZnVsZmlsbG1lbnQgPT4ge1xuICAgICAgICBpZiAoIWlzUmF3UmV0dXJuKSB7XG4gICAgICAgICAgbXVzdE1hdGNoKGhhcmRlbihmdWxmaWxsbWVudCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxmaWxsbWVudDtcbiAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PlxuICAgICAgICAvKiBEb25lIGlzIGEgY2hhaW5lZCBgLmNhdGNoYCByYXRoZXIgdGhhbiBhbiBvblJlamVjdGVkIGNsYXVzZSBvZiB0aGUqL1xuICAgICAgICAvKiBgRS53aGVuYCBhYm92ZSBpbiBjYXNlIHRoZSBgbXVzdE1hdGNoYCB0aHJvd3MuKi9cbiAgICAgICAgUHJvbWlzZS5yZWplY3QodG9UaHJvd2FibGUocmVhc29uKSksXG4gICAgICApO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBhc3luY01ldGhvZDtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kID0gKGdldENvbnRleHQsIGJlaGF2aW9yTWV0aG9kLCBtZXRob2RHdWFyZCwgbGFiZWwpID0+IHtcbiAgY29uc3QgbWV0aG9kR3VhcmRQYXlsb2FkID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgY29uc3QgeyBjYWxsS2luZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdzeW5jJykge1xuICAgIHJldHVybiBkZWZlbmRTeW5jTWV0aG9kKFxuICAgICAgZ2V0Q29udGV4dCxcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgbGFiZWwsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoY2FsbEtpbmQgPT09ICdhc3luYycpO1xuICAgIHJldHVybiBkZWZlbmRBc3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFRhZ1xuICogQHBhcmFtIHtDb250ZXh0UHJvdmlkZXJ9IGNvbnRleHRQcm92aWRlclxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqL1xuY29uc3QgYmluZE1ldGhvZCA9IChcbiAgbWV0aG9kVGFnLFxuICBjb250ZXh0UHJvdmlkZXIsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCAnZnVuY3Rpb24nKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSByZXByZXNlbnRhdGl2ZVxuICogQHJldHVybnMge0NsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9XG4gKi9cbiAgY29uc3QgZ2V0Q29udGV4dCA9IHJlcHJlc2VudGF0aXZlID0+IHtcbiAgICByZXByZXNlbnRhdGl2ZSB8fFxuICAgICAgLyogc2VwYXJhdGUgbGluZSB0byBlYXNlIGJyZWFrcG9pbnRpbmcqL1xuICAgICAgRmFpbGBNZXRob2QgJHttZXRob2RUYWd9IGNhbGxlZCB3aXRob3V0ICd0aGlzJyBvYmplY3RgO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjb250ZXh0UHJvdmlkZXIocmVwcmVzZW50YXRpdmUpO1xuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEZhaWxgJHtxKFxuICAgICAgICBtZXRob2RUYWcsXG4gICAgICApfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7cmVwcmVzZW50YXRpdmV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH07XG5cbiAgY29uc3QgbWV0aG9kID0gZGVmZW5kTWV0aG9kKFxuICAgIGdldENvbnRleHQsXG4gICAgYmVoYXZpb3JNZXRob2QsXG4gICAgbWV0aG9kR3VhcmQsXG4gICAgbWV0aG9kVGFnLFxuICApO1xuXG4gIGRlZmluZVByb3BlcnRpZXMobWV0aG9kLCB7XG4gICAgbmFtZTogeyB2YWx1ZTogbWV0aG9kVGFnIH0sXG4gICAgbGVuZ3RoOiB7IHZhbHVlOiBiZWhhdmlvck1ldGhvZC5sZW5ndGggfSxcbiAgfSk7XG4gIHJldHVybiBtZXRob2Q7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHsgW00gaW4ga2V5b2YgVF06IE1ldGhvZEd1YXJkIH0+fSBbaW50ZXJmYWNlR3VhcmRdXG4gKi9cbiAgICAgICBjb25zdCBkZWZlbmRQcm90b3R5cGUgPSAoXG4gIHRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZHMsXG4gIHRoaXNmdWxNZXRob2RzID0gZmFsc2UsXG4gIGludGVyZmFjZUd1YXJkID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IHByb3RvdHlwZSA9IHt9O1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuICAgIC8qIEJ5IGlnbm9yaW5nIGFueSBtZXRob2QgdGhhdCBzZWVtcyB0byBiZSBhIGNvbnN0cnVjdG9yLCB3ZSBjYW4gdXNlIGEqL1xuICAgIC8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuICAgIGtleSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBiZWhhdmlvck1ldGhvZHMuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlICYmXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9PT0gY29uc3RydWN0b3JcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgTWV0aG9kR3VhcmQ+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgbWV0aG9kR3VhcmRzO1xuICAvKiogQHR5cGUge0RlZmF1bHRHdWFyZFR5cGV9ICovXG4gIGxldCBkZWZhdWx0R3VhcmRzO1xuICBpZiAoaW50ZXJmYWNlR3VhcmQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcmZhY2VOYW1lLFxuICAgICAgbWV0aG9kR3VhcmRzOiBtZyxcbiAgICAgIHN5bWJvbE1ldGhvZEd1YXJkcyxcbiAgICAgIHNsb3BweSxcbiAgICAgIGRlZmF1bHRHdWFyZHM6IGRnID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IGRlZmF1bHRHdWFyZHMsXG4gICAgfSA9IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4gICAgbWV0aG9kR3VhcmRzID0gaGFyZGVuKHtcbiAgICAgIC4uLm1nLFxuICAgICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkcyAmJlxuICAgICAgICBmcm9tRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyhzeW1ib2xNZXRob2RHdWFyZHMpKSksXG4gICAgfSk7XG4gICAgZGVmYXVsdEd1YXJkcyA9IGRnO1xuICAgIHtcbiAgICAgIGNvbnN0IG1ldGhvZEd1YXJkTmFtZXMgPSBvd25LZXlzKG1ldGhvZEd1YXJkcyk7XG4gICAgICBjb25zdCB1bmltcGxlbWVudGVkID0gbGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcywgbWV0aG9kTmFtZXMpO1xuICAgICAgdW5pbXBsZW1lbnRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgRmFpbGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgICBpZiAoZGVmYXVsdEd1YXJkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHVuZ3VhcmRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLCBtZXRob2RHdWFyZE5hbWVzKTtcbiAgICAgICAgdW5ndWFyZGVkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBiZWhhdmlvck1ldGhvZHNbcHJvcF07XG4gICAgY29uc3QgeyBzaGlmdGVkTWV0aG9kIH0gPSB7XG4gICAgICBzaGlmdGVkTWV0aG9kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGJlaGF2aW9yTWV0aG9kID0gdGhpc2Z1bE1ldGhvZHMgPyBvcmlnaW5hbE1ldGhvZCA6IHNoaWZ0ZWRNZXRob2Q7XG4gICAgLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIyNDcjZGlzY3Vzc2lvbl9yMTU4MzcyNDQyNCovXG4gICAgbGV0IG1ldGhvZEd1YXJkID0gbWV0aG9kR3VhcmRzICYmIG1ldGhvZEd1YXJkc1twcm9wXTtcbiAgICBpZiAoIW1ldGhvZEd1YXJkKSB7XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRHdWFyZHMpIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgICBpZiAodGhpc2Z1bE1ldGhvZHMpIHtcbiAgICAgICAgICAgIG1ldGhvZEd1YXJkID0gUGFzc2FibGVNZXRob2RHdWFyZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBSYXdNZXRob2RHdWFyZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzc2FibGUnOiB7XG4gICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Jhdyc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBkZWZhdWx0R3VhcmRzICR7cShkZWZhdWx0R3VhcmRzKX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByb3RvdHlwZVtwcm9wXSA9IGJpbmRNZXRob2QoXG4gICAgICBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuICAgICAgY29udGV4dFByb3ZpZGVyLFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZCxcbiAgICApO1xuICB9XG5cbiAgaWYgKCFoYXNPd24ocHJvdG90eXBlLCBHRVRfSU5URVJGQUNFX0dVQVJEKSkge1xuICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkTWV0aG9kID0ge1xuICAgICAgW0dFVF9JTlRFUkZBQ0VfR1VBUkRdKCkge1xuICAgICAgICAvKiBOb3RlOiBNYXkgYmUgYHVuZGVmaW5lZGAqL1xuICAgICAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQ7XG4gICAgICB9LFxuICAgIH1bR0VUX0lOVEVSRkFDRV9HVUFSRF07XG4gICAgcHJvdG90eXBlW0dFVF9JTlRFUkZBQ0VfR1VBUkRdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EoR0VUX0lOVEVSRkFDRV9HVUFSRCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBnZXRJbnRlcmZhY2VHdWFyZE1ldGhvZCxcbiAgICAgIFBhc3NhYmxlTWV0aG9kR3VhcmQsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBGYXIodGFnLCAvKiogQHR5cGUge1QgJiBHZXRJbnRlcmZhY2VHdWFyZDxUPn0gKi8gKHByb3RvdHlwZSkpO1xufTskaM2PX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge3sgW0sgaW4ga2V5b2YgRl06IEtpdENvbnRleHRQcm92aWRlciB9fSBjb250ZXh0UHJvdmlkZXJLaXRcbiAqIEBwYXJhbSB7Rn0gYmVoYXZpb3JNZXRob2RzS2l0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7eyBbSyBpbiBrZXlvZiBGXTogSW50ZXJmYWNlR3VhcmQ8UmVjb3JkPGtleW9mIEZbS10sIE1ldGhvZEd1YXJkPj4gfX0gW2ludGVyZmFjZUd1YXJkS2l0XVxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlS2l0ID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcktpdCxcbiAgYmVoYXZpb3JNZXRob2RzS2l0LFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZEtpdCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBmYWNldE5hbWVzID0gb3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbiAgZmFjZXROYW1lcy5sZW5ndGggPiAxIHx8IEZhaWxgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG4gIGlmIChpbnRlcmZhY2VHdWFyZEtpdCkge1xuICAgIGNvbnN0IGludGVyZmFjZU5hbWVzID0gb3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG4gICAgY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGludGVyZmFjZU5hbWVzKTtcbiAgICBleHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsIGZhY2V0TmFtZXMpO1xuICAgIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gIH1cbiAgY29uc3QgY29udGV4dE1hcE5hbWVzID0gb3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuICBjb25zdCBleHRyYUNvbnRleHROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGNvbnRleHRNYXBOYW1lcyk7XG4gIGV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGNvbnRleHRNYXBOYW1lcywgZmFjZXROYW1lcyk7XG4gIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuICBjb25zdCBwcm90b0tpdCA9IG9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsIChiZWhhdmlvck1ldGhvZHMsIGZhY2V0TmFtZSkgPT5cbiAgICBkZWZlbmRQcm90b3R5cGUoXG4gICAgICBgJHt0YWd9ICR7U3RyaW5nKGZhY2V0TmFtZSl9YCxcbiAgICAgIGNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuICAgICAgYmVoYXZpb3JNZXRob2RzLFxuICAgICAgdGhpc2Z1bE1ldGhvZHMsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCAmJiBpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdLFxuICAgICksXG4gICk7XG4gIHJldHVybiBwcm90b0tpdDtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMkl2jYLBQAACwUAACYAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGF1dG9tYXRpY2FsbHkgYWRkZWQgZGVmYXVsdCBtZXRhLW1ldGhvZCBmb3JcbiAqIG9idGFpbmluZyBhbiBleG8ncyBpbnRlcmZhY2UsIGlmIGl0IGhhcyBvbmUuXG4gKlxuICogSW50ZW5kZWQgdG8gYmUgc2ltaWxhciB0byBgR0VUX01FVEhPRF9OQU1FU2AgZnJvbSBgQGVuZG8vcGFzcy1zdHlsZWAuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MDkjZGlzY3Vzc2lvbl9yMTM4ODA1MjQ1NFxuICpcbiAqIEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfSU5URVJGQUNFX0dVQVJEID0gJ19fZ2V0SW50ZXJmYWNlR3VhcmRfXyc7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgQ2FsbGFibGVGdW5jdGlvbj59IE1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtHRVRfSU5URVJGQUNFX0dVQVJEXT86ICgpID0+XG4gKiAgICAgSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPHtcbiAqICAgICAgIFtLIGluIGtleW9mIE1dOiBJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kR3VhcmRcbiAqICAgICB9PiB8IHVuZGVmaW5lZFxuICogfX0gR2V0SW50ZXJmYWNlR3VhcmRcbiAqLyRozY9fb25jZS5HRVRfSU5URVJGQUNFX0dVQVJEKEdFVF9JTlRFUkZBQ0VfR1VBUkQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiR0VUX0lOVEVSRkFDRV9HVUFSRCI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAAB4AAABAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKkm1lCYAgAAmAIAAB4AAABAZW5kby9mYXItdjEuMS4xNC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9ldmVudHVhbC1zZW5kIjpbWyJFIiwiRSJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siRmFyIiwiRmFyIl0sWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1Rn/ZBwgAAAcIAAAdAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlQnlDb2RlUG9pbnRzIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIixudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl0sWyJwYXNzYWJsZUFzSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiJdLFsicXAiLCJxcCJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJjb21wYXJlTnVtZXJpY3MiLCJjb21wYXJlTnVtZXJpY3MiXSxbImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlQnlDb2RlUG9pbnRzIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGC/aqjJfQAAyX0AACoAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCovXG5jb25zdCByQzAgPSAvW1xceDAwLVxceDFGXS87XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdWZmaXggb2YgYSBzdHJpbmcgc3RhcnRpbmcgYXQgYSBwYXJ0aWN1bGFyIGluZGV4LlxuICogVGhpcyBib3RoIGV4cHJlc3NlcyBpbnRlbnQgYW5kIHBvdGVudGlhbGx5IGF2b2lkcyBzbG93IGBzdWJzdHJpbmdgIGluIFhTLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRTdWZmaXggPSAoc3RyLCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gc3RyIDogc3RyLnN1YnN0cmluZyhpbmRleCkpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG4gICAgICAgY29uc3QgcmVjb3JkTmFtZXMgPSByZWNvcmQgPT5cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbiAgLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbiAgLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuICAvKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbiAgLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG4gIGhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyZWNvcmQpKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZFZhbHVlcyA9IChyZWNvcmQsIG5hbWVzKSA9PlxuICBoYXJkZW4obmFtZXMubWFwKG5hbWUgPT4gcmVjb3JkW25hbWVdKSk7JGjNj19vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0IHplcm9lcyA9IEFycmF5KDE2KVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGkpID0+ICcwJy5yZXBlYXQoaSkpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCB6ZXJvUGFkID0gKG4sIHNpemUpID0+IHtcbiAgY29uc3QgblN0ciA9IGAke259YDtcbiAgY29uc3QgZmlsbExlbiA9IHNpemUgLSBuU3RyLmxlbmd0aDtcbiAgaWYgKGZpbGxMZW4gPT09IDApIHJldHVybiBuU3RyO1xuICBhc3NlcnQoZmlsbExlbiA+IDAgJiYgZmlsbExlbiA8IHplcm9lcy5sZW5ndGgpO1xuICByZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xufTskaM2PX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyID0gbmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cyA9IG5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHMgPSAnZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0ID0gbiA9PiB7XG4gIC8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuICBpZiAoaXMobiwgLTApKSB7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSBpZiAoaXMobiwgTmFOKSkge1xuICAgIHJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuICB9XG4gIGFzTnVtYmVyWzBdID0gbjtcbiAgbGV0IGJpdHMgPSBhc0JpdHNbMF07XG4gIGlmIChuIDwgMCkge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgcmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLCAxNil9YDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0ID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gIGVuY29kZWQuY2hhckF0KHNraXApID09PSAnZicgfHwgRmFpbGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBiaXRzID0gQmlnSW50KGAweCR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKX1gKTtcbiAgaWYgKGVuY29kZWQuY2hhckF0KHNraXAgKyAxKSA8ICc4Jykge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgYXNCaXRzWzBdID0gYml0cztcbiAgY29uc3QgcmVzdWx0ID0gYXNOdW1iZXJbMF07XG4gICFpcyhyZXN1bHQsIC0wKSB8fFxuICAgIEZhaWxgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50ID0gbiA9PiB7XG4gIGNvbnN0IGFicyA9IG4gPCAwbiA/IC1uIDogbjtcbiAgY29uc3QgbkRpZ2l0cyA9IGFicy50b1N0cmluZygpLmxlbmd0aDtcbiAgY29uc3QgbERpZ2l0cyA9IG5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGlmIChuIDwgMG4pIHtcbiAgICByZXR1cm4gYG4ke1xuICAgICAgLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbiAgICAgIC8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbiAgICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4gICAgICAoMTAgKiogbERpZ2l0cyAtIG5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywgJzAnKVxuICAgIH06JHtcbiAgICAgIC8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbiAgICAgICgxMG4gKiogQmlnSW50KG5EaWdpdHMpICsgbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCAnMCcpXG4gICAgfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBwJHtcbiAgICAgIC8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4gICAgICAvKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4gICAgICAnficucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuICAgICAgbkRpZ2l0c1xuICAgIH06JHtcbiAgICAgIC8qIFRoZSBkaWdpdHMuKi9cbiAgICAgIG5cbiAgICB9YDtcbiAgfVxufTtcblxuY29uc3QgckJpZ0ludFBheWxvYWQgPSAvKFswLTldKykoOihbMC05XSskfCl8KS9zO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQgPSBlbmNvZGVkID0+IHtcbiAgY29uc3QgdHlwZVByZWZpeCA9IGVuY29kZWQuY2hhckF0KDApOyAvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbiAgdHlwZVByZWZpeCA9PT0gJ3AnIHx8XG4gICAgdHlwZVByZWZpeCA9PT0gJ24nIHx8XG4gICAgRmFpbGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgY29uc3Qge1xuICAgIGluZGV4OiBsRGlnaXRzLFxuICAgIDE6IHNuRGlnaXRzLFxuICAgIDI6IHRhaWwsXG4gICAgMzogZGlnaXRzLFxuICB9ID0gZW5jb2RlZC5tYXRjaChyQmlnSW50UGF5bG9hZCkgfHwgRmFpbGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgc25EaWdpdHMubGVuZ3RoID09PSBsRGlnaXRzIHx8XG4gICAgRmFpbGBVbmFyeS1wcmVmaXhlZCBkZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG5EaWdpdHMgPSBwYXJzZUludChzbkRpZ2l0cywgMTApO1xuICBpZiAodHlwZVByZWZpeCA9PT0gJ24nKSB7XG4gICAgLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuICAgIC8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbiAgICBuRGlnaXRzID0gMTAgKiogLyoqIEB0eXBlIHtudW1iZXJ9ICovIChsRGlnaXRzKSAtIG5EaWdpdHM7XG4gIH1cblxuICB0YWlsLmNoYXJBdCgwKSA9PT0gJzonIHx8IEZhaWxgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgZGlnaXRzLmxlbmd0aCA9PT0gbkRpZ2l0cyB8fFxuICAgIEZhaWxgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG4gPSBCaWdJbnQoZGlnaXRzKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbiAgICAvKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xuICAgIG4gPSAtKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgLSBuKTtcbiAgfVxuXG4gIHJldHVybiBuO1xufTtcblxuLyoqXG4gKiBBIHNwYXJzZSBhcnJheSBmb3Igd2hpY2ggZXZlcnkgcHJlc2VudCBpbmRleCBtYXBzIGEgY29kZSBwb2ludCBpbiB0aGUgQVNDSUlcbiAqIHJhbmdlIHRvIGEgY29ycmVzcG9uZGluZyBlc2NhcGUgc2VxdWVuY2UuXG4gKlxuICogRXNjYXBlcyBhbGwgY2hhcmFjdGVycyBmcm9tIFUrMDAwMCBOVUxMIHRvIFUrMDAxRiBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FXG4gKiBsaWtlIGAhPGNoYXJhY3RlciBvZmZzZXQgYnkgMHgyMT5gIHRvIGF2b2lkIEpTT04uc3RyaW5naWZ5IGV4cGFuc2lvbiBhc1xuICogYFxcdUhISEhgLCBhbmQgc3BlY2lhbGx5IGVzY2FwZXMgVSswMDIwIFNQQUNFICh0aGUgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yKVxuICogYXMgYCFfYCBhbmQgVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgKHRoZSBlc2NhcGUgcHJlZml4KSBhcyBgIXxgIChib3RoIGNob3NlblxuICogZm9yIHZpc3VhbCBhcHByb3hpbWF0aW9uKS5cbiAqIFJlbGF0aXZlIGxleGljb2dyYXBoaWMgb3JkZXJpbmcgaXMgcHJlc2VydmVkIGJ5IHRoaXMgbWFwcGluZyBvZiBhbnkgY2hhcmFjdGVyXG4gKiBhdCBvciBiZWZvcmUgYCFgIGluIHRoZSBjb250aWd1b3VzIHJhbmdlIFsweDAwLi4weDIxXSB0byBhIHJlc3BlY3RpdmVcbiAqIGNoYXJhY3RlciBpbiBbMHgyMS4uMHg0MCwgMHg1RiwgMHg3Q10gcHJlY2VkZWQgYnkgYCFgICh3aGljaCBpcyBpdHNlbGYgaW4gdGhlXG4gKiByZXBsYWNlZCByYW5nZSkuXG4gKiBTaW1pbGFybHksIGVzY2FwZXMgYF5gIGFzIGBfQGAgYW5kIGBfYCBhcyBgX19gIGJlY2F1c2UgYF5gIGluZGljYXRlcyB0aGVcbiAqIHN0YXJ0IG9mIGFuIGVuY29kZWQgYXJyYXkuXG4gKlxuICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGNwKSA9PiB7XG4gICAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICAgIHJldHVybiAnIV8nO1xuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiAnIXwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgICB9XG4gIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV0gPSAnX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV0gPSAnX18nO1xuXG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgd2l0aCBlc2NhcGUgc2VxdWVuY2VzIGZvciB1c2UgaW4gdGhlIFwiY29tcGFjdE9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gc3RyID0+XG4gIHN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywgY2ggPT4gc3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qKlxuICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2ggPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHN1ZmZpeCk7XG4gICAgICAgIC8qIFRoZSByYW5nZSBvZiB2YWxpZCBgIWAtZXNjYXBlIHN1ZmZpeGVzIGlzIFsoMHgwMCsweDIxKS4uKDB4MUYrMHgyMSldLCBpLmUuKi9cbiAgICAgICAgLyogWzB4MjEuLjB4NDBdIChVKzAwMjEgRVhDTEFNQVRJT04gTUFSSyB0byBVKzAwNDAgQ09NTUVSQ0lBTCBBVCkuKi9cbiAgICAgICAgKHByZWZpeCA9PT0gJyEnICYmIHN1ZmZpeCAhPT0gdW5kZWZpbmVkICYmIGNoID49ICchJyAmJiBjaCA8PSAnQCcpIHx8XG4gICAgICAgICAgRmFpbGBpbnZhbGlkIHN0cmluZyBlc2NhcGU6ICR7cShlc2MpfWA7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgLSAweDIxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZW5jb2RlcyBhIHN0cmluZyBmb3IgdXNlIGluIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBzdHIgPT4gc3RyO1xuXG4vKipcbiAqIFRyaXZpYWxseSBpZGVudGl0eS1kZWNvZGVzIGEgc3RyaW5nIGZyb20gdGhlIFwibGVnYWN5T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IGVuY29kZWQ7XG5cbi8qKlxuICogRW5jb2RlcyBhbiBhcnJheSBpbnRvIGEgc2VxdWVuY2Ugb2YgZW5jb2RlZCBlbGVtZW50cyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCJcbiAqIGZvcm1hdCwgZWFjaCB0ZXJtaW5hdGVkIGJ5IGEgc3BhY2UgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGVzY2FwZWQgcmFuZ2UgaW5cbiAqIFwiY29tcGFjdE9yZGVyZWRcIiBlbmNvZGVkIHN0cmluZ3MpLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydeJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGNoYXJzLnB1c2goZW5jLCAnICcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgLyogU2NhbiBlbmNvZGVkIHJhdGhlciB0aGFuIGl0cyB0YWlsIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgbGV0IG5leHRJbmRleCA9IHNraXAgKyAxO1xuICBsZXQgY3VycmVudEVsZW1lbnRTdGFydCA9IHNraXAgKyAxO1xuICBmb3IgKGNvbnN0IHsgMDogY2gsIGluZGV4OiBpIH0gb2YgZW5jb2RlZC5tYXRjaEFsbCgvW1xcXiBdL2cpKSB7XG4gICAgY29uc3QgaW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGkpO1xuICAgIGlmIChpbmRleCA8PSBza2lwKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHNraXApIHtcbiAgICAgICAgY2ggPT09ICdeJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJ14nKSB7XG4gICAgICAvKiBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIG5lc3RlZCBhcnJheS4qL1xuICAgICAgLyogVE9ETzogU2luY2UgdGhlIHN5bnRheCBvZiBuZXN0ZWQgYXJyYXlzIG11c3QgYmUgdmFsaWRhdGVkIGFzIHBhcnQgb2YqL1xuICAgICAgLyogZGVjb2RpbmcgdGhlIG91dGVyIG9uZSwgY29uc2lkZXIgZGVjb2RpbmcgdGhlbSBoZXJlIGludG8gYSBzaGFyZWQgY2FjaGUqL1xuICAgICAgLyogcmF0aGVyIHRoYW4gZGlzY2FyZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZW50cyB1bnRpbCB0aGUgbGF0ZXIqL1xuICAgICAgLyogZGVjb2RlUGFzc2FibGUuKi9cbiAgICAgIGRlcHRoICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoaXMgaXMgYSB0ZXJtaW5hdGVkIGVsZW1lbnQuKi9cbiAgICAgIGlmIChpbmRleCA9PT0gbmV4dEluZGV4KSB7XG4gICAgICAgIC8qIEEgdGVybWluYXRvciBhZnRlciBgW2Agb3IgYW4gYW5vdGhlciB0ZXJtaW5hdG9yIGluZGljYXRlcyB0aGF0IGFuIGFycmF5IGlzIGRvbmUuKi9cbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgZGVwdGggPj0gMCB8fFxuICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsIGluZGV4ICsgMil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAvKiBXZSBoYXZlIGEgY29tcGxldGUgZWxlbWVudCBvZiB0aGUgdG9wbW9zdCBhcnJheS4qL1xuICAgICAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgICAgIGRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCwgaW5kZXgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudEVsZW1lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogQWR2YW5jZSB0aGUgaW5kZXguKi9cbiAgICBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gIH1cbiAgZGVwdGggPT09IDAgfHwgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIG5leHRJbmRleCA9PT0gZW5jb2RlZC5sZW5ndGggfHxcbiAgICBGYWlsYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbiAgICAgIGVuY29kZWQsXG4gICAgICBjdXJyZW50RWxlbWVudFN0YXJ0LFxuICAgICl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcmlnaW5hbCBhcnJheSBlbmNvZGluZywgd2hpY2ggZXNjYXBlcyBhbGwgZW5jb2RlZCBhcnJheVxuICogZWxlbWVudHMgcmF0aGVyIHRoYW4ganVzdCBzdHJpbmdzIChgXFx1MDAwMGAgYXMgdGhlIGVsZW1lbnQgdGVybWluYXRvciBhbmRcbiAqIGBcXHUwMDAxYCBhcyB0aGUgZXNjYXBlIHByZWZpeCBmb3IgYFxcdTAwMDBgIG9yIGBcXHUwMDAxYCkuXG4gKiBUaGlzIG5lY2Vzc2l0YXRlZCBhbiB1bmRlc2lyYWJsZSBhbW91bnQgb2YgaXRlcmF0aW9uIGFuZCBleHBhbnNpb247IHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3I5NjAzNjk4MjZcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydbJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgYyBvZiBlbmMpIHtcbiAgICAgIGlmIChjID09PSAnXFx1MDAwMCcgfHwgYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICAgIGNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiAgICAgIH1cbiAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgY29uc3QgZWxlbUNoYXJzID0gW107XG4gIC8qIFVzZSBhIHN0cmluZyBpdGVyYXRvciB0byBhdm9pZCBzbG93IGluZGV4ZWQgYWNjZXNzIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGxldCBzdGlsbFRvU2tpcCA9IHNraXAgKyAxO1xuICBsZXQgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBjIG9mIGVuY29kZWQpIHtcbiAgICBpZiAoc3RpbGxUb1NraXAgPiAwKSB7XG4gICAgICBzdGlsbFRvU2tpcCAtPSAxO1xuICAgICAgaWYgKHN0aWxsVG9Ta2lwID09PSAwKSB7XG4gICAgICAgIGMgPT09ICdbJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbkVzY2FwZSkge1xuICAgICAgYyA9PT0gJ1xcdTAwMDAnIHx8XG4gICAgICAgIGMgPT09ICdcXHUwMDAxJyB8fFxuICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjfWA7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29uc3QgZW5jb2RlZEVsZW1lbnQgPSBlbGVtQ2hhcnMuam9pbignJyk7XG4gICAgICBlbGVtQ2hhcnMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG4gICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICBpbkVzY2FwZSA9IHRydWU7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWUqL1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBpbkVzY2FwZSA9IGZhbHNlO1xuICB9XG4gICFpbkVzY2FwZSB8fCBGYWlsYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGVsZW1DaGFycy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0J5dGVBcnJheX0gYnl0ZUFycmF5XG4gKiBAcGFyYW0geyhieXRlQXJyYXk6IEJ5dGVBcnJheSkgPT4gc3RyaW5nfSBfZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJ5dGVBcnJheSA9IChieXRlQXJyYXksIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAvKiBUT0RPIGltcGxlbWVudCovXG4gIEZhaWxgZW5jb2RlUGFzc2FibGUoYnl0ZUFycmF5KSBub3QgeWV0IGltcGxlbWVudGVkOiAke2J5dGVBcnJheX1gO1xuICByZXR1cm4gJyc7IC8qIEp1c3QgZm9yIHRoZSB0eXBlKi9cbn07XG5cbmNvbnN0IGVuY29kZVJlY29yZCA9IChyZWNvcmQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBuYW1lcyA9IHJlY29yZE5hbWVzKHJlY29yZCk7XG4gIGNvbnN0IHZhbHVlcyA9IHJlY29yZFZhbHVlcyhyZWNvcmQsIG5hbWVzKTtcbiAgcmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLCB2YWx1ZXNdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG59O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICcoJyk7XG4gIC8qIFNraXAgdGhlIFwiKFwiIGluc2lkZSBgZGVjb2RlQXJyYXlgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgY29uc3QgdW56aXBwZWRFbnRyaWVzID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdW56aXBwZWRFbnRyaWVzLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW2tleXMsIHZhbHNdID0gdW56aXBwZWRFbnRyaWVzO1xuXG4gIChwYXNzU3R5bGVPZihrZXlzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBwYXNzU3R5bGVPZih2YWxzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBrZXlzLmxlbmd0aCA9PT0gdmFscy5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KGtleSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykpIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IG1hcEVudHJpZXMgPSBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWxzW2ldXSk7XG4gIGNvbnN0IHJlY29yZCA9IGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG4gIGFzc2VydFJlY29yZChyZWNvcmQsICdkZWNvZGVkIHJlY29yZCcpO1xuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkID0gKHRhZ2dlZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PlxuICBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSwgdGFnZ2VkLnBheWxvYWRdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJzonKTtcbiAgLyogU2tpcCB0aGUgXCI6XCIgaW5zaWRlIGBkZWNvZGVBcnJheWAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBjb25zdCB0YWdnZWRQYXlsb2FkID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdGFnZ2VkUGF5bG9hZC5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFt0YWcsIHBheWxvYWRdID0gdGFnZ2VkUGF5bG9hZDtcbiAgcGFzc1N0eWxlT2YodGFnKSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgICBGYWlsYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1JlbW90YWJsZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVQcm9taXNlID0gKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSAocCwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVByb21pc2UocCwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJz8nKSB8fFxuICAgICAgRmFpbGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUHJvbWlzZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVByb21pc2U7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlRXJyb3IgPSAodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gKGVyciwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZUVycm9yKGVyciwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJyEnKSB8fFxuICAgICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqIEBwcm9wZXJ0eSB7J2xlZ2FjeU9yZGVyZWQnIHwgJ2NvbXBhY3RPcmRlcmVkJ30gW2Zvcm1hdF1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9IGVuY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoYXJyOiB1bmtub3duW10sIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZykgPT4gc3RyaW5nfSBlbmNvZGVBcnJheVxuICogQHBhcmFtIHtSZXF1aXJlZDxFbmNvZGVPcHRpb25zPiAmIHt2ZXJpZnlFbmNvZGluZz86IChlbmNvZGVkOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpID0+IHZvaWR9fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gbWFrZUVuY29kZVJlbW90YWJsZShcbiAgICB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgdmVyaWZ5RW5jb2RpbmcsXG4gICk7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSBtYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZyk7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gbWFrZUVuY29kZUVycm9yKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZyk7XG5cbiAgY29uc3QgaW5uZXJFbmNvZGUgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4gICAgICAvKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuICAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbiAgICAgIC8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuICAgICAgLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuICAgICAgLyoqL1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4gICAgICAvKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4gICAgICAvKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbiAgICAgIC8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOiB7XG4gICAgICAgIHJldHVybiAndic7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAneic7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHJldHVybiBgcyR7ZW5jb2RlU3RyaW5nU3VmZml4KHBhc3NhYmxlKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgcmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlbW90YWJsZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgLyogU3RyaW5ncyBhbmQgc3ltYm9scyBzaGFyZSBlbmNvZGluZyBsb2dpYy4qL1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgIHJldHVybiBgeSR7ZW5jb2RlU3RyaW5nU3VmZml4KG5hbWUpfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQnl0ZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJFbmNvZGU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGVPYmplY3R9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiogQHR5cGUge1JlcXVpcmVkPERlY29kZU9wdGlvbnM+fSAqLyAoXG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qKlxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9IGRlY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nLCBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGUsIHNraXA/OiBudW1iZXIpID0+IHVua25vd25bXX0gZGVjb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nLCBza2lwPzogbnVtYmVyKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcsIHNraXA/OiBudW1iZXIpID0+IFBhc3NhYmxlfSAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8qIFN0cmluZ3MgYW5kIHN5bWJvbHMgc2hhcmUgZGVjb2RpbmcgbG9naWMuKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1snOlxuICAgICAgY2FzZSAnXic6IHtcbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlICd1bmtub3duW10nIGlzIG5vdCBQYXNzYWJsZSovXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhc3NhYmxlS2l0XG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8bWFrZUlubmVyRW5jb2RlPn0gZW5jb2RlUGFzc2FibGVcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJEZWNvZGU+fSBkZWNvZGVQYXNzYWJsZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zICYgRGVjb2RlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFzc2FibGVLaXQgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGUgPSAociwgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyfWAsXG4gICAgZW5jb2RlUHJvbWlzZSA9IChwLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwfWAsXG4gICAgZW5jb2RlRXJyb3IgPSAoZXJyLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWAsXG4gICAgZm9ybWF0ID0gJ2xlZ2FjeU9yZGVyZWQnLFxuXG4gICAgZGVjb2RlUmVtb3RhYmxlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlUHJvbWlzZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVFcnJvciA9IChlbmNvZGluZywgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8qKiBAdHlwZSB7UGFzc2FibGVLaXRbJ2VuY29kZVBhc3NhYmxlJ119ICovXG4gIGxldCBlbmNvZGVQYXNzYWJsZTtcbiAgY29uc3QgZW5jb2RlT3B0aW9ucyA9IHsgZW5jb2RlUmVtb3RhYmxlLCBlbmNvZGVQcm9taXNlLCBlbmNvZGVFcnJvciwgZm9ybWF0IH07XG4gIGlmIChmb3JtYXQgPT09ICdjb21wYWN0T3JkZXJlZCcpIHtcbiAgICBjb25zdCBsaWJlcmFsRGVjb2RlID0gbWFrZUlubmVyRGVjb2RlKFxuICAgICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICAgIGRlY29kZUNvbXBhY3RBcnJheSxcbiAgICAgIGxpYmVyYWxEZWNvZGVycyxcbiAgICApO1xuICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgY29uc3QgdmVyaWZ5RW5jb2RpbmcgPSAoZW5jb2RpbmcsIGxhYmVsKSA9PiB7XG4gICAgICAhZW5jb2RpbmcubWF0Y2gockMwKSB8fFxuICAgICAgICBGYWlsYCR7YihcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gZW5jb2RpbmcgbXVzdCBub3QgY29udGFpbiBhIEMwIGNvbnRyb2wgY2hhcmFjdGVyOiAke2VuY29kaW5nfWA7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlQ29tcGFjdEFycmF5KGBediAke2VuY29kaW5nfSB2IGAsIGxpYmVyYWxEZWNvZGUpO1xuICAgICAgKGlzQXJyYXkoZGVjb2RlZCkgJiZcbiAgICAgICAgZGVjb2RlZC5sZW5ndGggPT09IDMgJiZcbiAgICAgICAgZGVjb2RlZFswXSA9PT0gbnVsbCAmJlxuICAgICAgICBkZWNvZGVkWzJdID09PSBudWxsKSB8fFxuICAgICAgICBGYWlsYCR7YihsYWJlbCl9IGVuY29kaW5nIG11c3QgYmUgZW1iZWRkYWJsZTogJHtlbmNvZGluZ31gO1xuICAgIH07XG4gICAgY29uc3QgZW5jb2RlQ29tcGFjdCA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVDb21wYWN0QXJyYXksXG4gICAgICB7IC4uLmVuY29kZU9wdGlvbnMsIHZlcmlmeUVuY29kaW5nIH0sXG4gICAgKTtcbiAgICBlbmNvZGVQYXNzYWJsZSA9IHBhc3NhYmxlID0+IGB+JHtlbmNvZGVDb21wYWN0KHBhc3NhYmxlKX1gO1xuICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2xlZ2FjeU9yZGVyZWQnKSB7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVMZWdhY3lBcnJheSxcbiAgICAgIGVuY29kZU9wdGlvbnMsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBmb3JtYXQ6ICR7cShmb3JtYXQpfWA7XG4gIH1cblxuICBjb25zdCBkZWNvZGVPcHRpb25zID0geyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH07XG4gIGNvbnN0IGRlY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlTGVnYWN5ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVMZWdhY3lBcnJheSxcbiAgICBkZWNvZGVPcHRpb25zLFxuICApO1xuICBjb25zdCBkZWNvZGVQYXNzYWJsZSA9IGVuY29kZWQgPT4ge1xuICAgIC8qIEEgbGVhZGluZyBcIn5cIiBpbmRpY2F0ZXMgdGhlIHYyIGVuY29kaW5nICh3aXRoIGVzY2FwaW5nIGluIHN0cmluZ3MgcmF0aGVyIHRoYW4gYXJyYXlzKS4qL1xuICAgIC8qIFNraXAgaXQgaW5zaWRlIGBkZWNvZGVDb21wYWN0YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdFsnZW5jb2RlUGFzc2FibGUnXX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVQYXNzYWJsZSA9IGVuY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGVuY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZW5jb2RlT3B0aW9ucyk7XG4gIHJldHVybiBlbmNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdFsnZGVjb2RlUGFzc2FibGUnXX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVQYXNzYWJsZSA9IGRlY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGRlY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZGVjb2RlT3B0aW9ucyk7XG4gIHJldHVybiBkZWNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbiAgICAgICBjb25zdCBpc0VuY29kZWRSZW1vdGFibGUgPSBlbmNvZGVkID0+IGVuY29kZWQuY2hhckF0KDApID09PSAncic7JGjNj19vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3by1jaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4IChgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiKSwgYW5kIGNvcHlBcnJheSBpcyBhIHR3by1jaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2Ugb25lIGVuY29kaW5nXG4gKiBwcmVmaXhlcyBhcnJheXMgd2l0aCBgW2Agd2hpbGUgdGhlIG90aGVyIHVzZXMgYF5gICh3aGljaCBpcyBwcm9oaWJpdGVkIGZyb21cbiAqIGFwcGVhcmluZyBpbiBhbiBlbmNvZGVkIHN0cmluZykuXG4gKiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlIHJhbmtPcmRlcmluZyBvZiB0aGVpclxuICogcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLCBhbmQgcmFua09yZGVyLmpzIGltcG9ydHMgdGhlIHRhYmxlIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBieXRlQXJyYXk6ICdhJyxcbiAgYm9vbGVhbjogJ2InLFxuICBudW1iZXI6ICdmJyxcbiAgYmlnaW50OiAnbnAnLFxuICByZW1vdGFibGU6ICdyJyxcbiAgc3RyaW5nOiAncycsXG4gIG51bGw6ICd2JyxcbiAgc3ltYm9sOiAneScsXG4gIC8qIEJlY2F1c2UgQXJyYXkucHJvdG90eXBlLnNvcnQgcHV0cyB1bmRlZmluZWQgdmFsdWVzIGF0IHRoZSBlbmQgd2l0aG91dCovXG4gIC8qIHBhc3NpbmcgdGhlbSB0byBhIGNvbXBhcmlzb24gZnVuY3Rpb24sIHVuZGVmaW5lZCBNVVNUIGJlIHRoZSBsYXN0Ki9cbiAgLyogY2F0ZWdvcnkuKi9cbiAgdW5kZWZpbmVkOiAneicsXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1cJzuhdEAAAXRAAAKwAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzUHJpbWl0aXZlLGdldFRhZyxhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qKiBAaW1wb3J0IHtFbmNvZGluZywgRW5jb2RpbmdVbmlvbn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgZGVmaW5lUHJvcGVydGllcyxcbiAgaXMsXG4gIGVudHJpZXMsXG4gIGZyb21FbnRyaWVzLFxuICBmcmVlemUsXG4gIGhhc093bixcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUyA9ICdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nICYgb2JqZWN0fSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3MgPSBlbmNvZGVkID0+IGhhc093bihlbmNvZGVkLCBRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzID0gKGVuY29kZWQsIHFjbGFzcykgPT5cbiAgIWlzUHJpbWl0aXZlKGVuY29kZWQpICYmXG4gICFpc0FycmF5KGVuY29kZWQpICYmXG4gIGhhc1FDbGFzcyhlbmNvZGVkKSAmJlxuICBlbmNvZGVkW1FDTEFTU10gPT09IHFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGVPYmplY3QsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IHJlbSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSBlcnIgPT4gRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvQ2FwRGF0YSA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgIGVuY29kZUVycm9yVG9DYXBEYXRhID0gZG9udEVuY29kZUVycm9yVG9DYXBEYXRhLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICAvKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1ciA9IHBhc3NhYmxlID0+IHtcbiAgICAvKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbiAgICAvKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAndW5kZWZpbmVkJyB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdJbmZpbml0eScgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICctSW5maW5pdHknIH07XG4gICAgICAgIH1cbiAgICAgICAgLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ2JpZ2ludCcsXG4gICAgICAgICAgZGlnaXRzOiBTdHJpbmcocGFzc2FibGUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnc3ltYm9sJyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGhhc093bihwYXNzYWJsZSwgUUNMQVNTKSkge1xuICAgICAgICAgIC8qIEhpbGJlcnQgaG90ZWwqL1xuICAgICAgICAgIGNvbnN0IHsgW1FDTEFTU106IHFjbGFzc1ZhbHVlLCAuLi5yZXN0IH0gPSBwYXNzYWJsZTtcbiAgICAgICAgICAvKiogQHR5cGUge0VuY29kaW5nfSAqL1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIFtRQ0xBU1NdOiAnaGlsYmVydCcsXG4gICAgICAgICAgICBvcmlnaW5hbDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG93bktleXMocmVzdCkubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIC8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuICAgICAgICAgICAgLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4gICAgICAgICAgICAvKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbiAgICAgICAgICAgIC8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4gICAgICAgICAgICAvKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbiAgICAgICAgICAgIC8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xuICAgICAgICAgICAgcmVzdWx0LnJlc3QgPSBlbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4gICAgICAgIC8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4gICAgICAgIC8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogVE9ETyBpbXBsZW1lbnQqL1xuICAgICAgICB0aHJvdyBGYWlsYG1hcnNhbCBvZiBieXRlQXJyYXkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAndGFnZ2VkJyxcbiAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9DYXBEYXRhUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICAvKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICl9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ3Nsb3QnLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdlcnJvcicpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgcmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gc2xvdEVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhID0gZXJyb3JFbmNvZGluZyA9PlxuICBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gICAgRmFpbGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEsXG4gICAgKX0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuICAvKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuICBjb25zdCBkZWNvZGVGcm9tQ2FwRGF0YSA9IGpzb25FbmNvZGVkID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUoanNvbkVuY29kZWQpKSB7XG4gICAgICAvKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG4gICAgICByZXR1cm4ganNvbkVuY29kZWQ7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KGpzb25FbmNvZGVkKSkge1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkLm1hcChlbmNvZGVkVmFsID0+IGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiAgICB9IGVsc2UgaWYgKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IGpzb25FbmNvZGVkW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIHN3aXRjaCAocWNsYXNzKSB7XG4gICAgICAgIC8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ05hTic6IHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0luZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuICAgICAgICAgIC8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4gICAgICAgICAgLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuICAgICAgICAgIC8qKi9cbiAgICAgICAgICByZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4gICAgICAgICAgLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbiAgICAgICAgICAvKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbiAgICAgICAgICAvKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4gICAgICAgICAgLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuICAgICAgICAgIC8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd24oanNvbkVuY29kZWQsICdvcmlnaW5hbCcpIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4gICAgICAgICAgLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IFtRQ0xBU1NdOiBkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCkgfTtcbiAgICAgICAgICBpZiAoaGFzT3duKGpzb25FbmNvZGVkLCAncmVzdCcpKSB7XG4gICAgICAgICAgICBjb25zdCBpc05vbkVtcHR5T2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHJlc3QgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIHJlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMTtcbiAgICAgICAgICAgIGlmICghaXNOb25FbXB0eU9iamVjdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdE9iaiA9IGRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuICAgICAgICAgICAgLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuICAgICAgICAgICAgLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4gICAgICAgICAgICAvKiBlYXJseSB0byBkbyB0aGF0LiovXG4gICAgICAgICAgICAhaGFzT3duKHJlc3RPYmosIFFDTEFTUykgfHxcbiAgICAgICAgICAgICAgRmFpbGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbiAgICAgICAgY2FzZSAnaWJpZCc6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxuICAgICAgICAgICAgcWNsYXNzLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eXBlb2YganNvbkVuY29kZWQgPT09ICdvYmplY3QnICYmIGpzb25FbmNvZGVkICE9PSBudWxsKTtcbiAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtuYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAANU1+O9EUAAPRFAAAtAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qIEZJWE1FIGRlZmluZSBhY3R1YWwgdHlwZXMqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBpcywgZW50cmllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG5jb25zdCBCQU5HID0gJyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIID0gJy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbCA9IGVuY29kZWRTdHIgPT4ge1xuICBpZiAoZW5jb2RlZFN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG4gIGNvbnN0IGNvZGUgPSBlbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbiAgcmV0dXJuIEJBTkcgPD0gY29kZSAmJiBjb2RlIDw9IERBU0g7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IHJlbSA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZXJyID0+XG4gIEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogZW5jb2RlT3B0aW9ucyBpcyBhY3R1YWxseSBvcHRpb25hbCwgYnV0IG5vdCBtYXJrZWQgYXMgc3VjaCB0byB3b3JrIGFyb3VuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDI4NlxuICpcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICBjb25zdCBhc3NlcnRFbmNvZGVkRXJyb3IgPSBlbmNvZGluZyA9PiB7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ29iamVjdCcgJiYgaGFzT3duKGVuY29kaW5nLCAnI2Vycm9yJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICl9YDtcbiAgICAvKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbiAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RpbmdbJyNlcnJvciddO1xuICAgICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICghc3RhcnRzU3BlY2lhbChtZXNzYWdlKSB8fCBtZXNzYWdlLmNoYXJBdCgwKSA9PT0gJyEnKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gIH07XG5cbiAgLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4gICAgLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbiAgICAgICAgICAvKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuICAgICAgICAgIC8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4gICAgICAgICAgLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4gICAgICAgICAgLyogcHJlc2VydmluZy4qL1xuICAgICAgICAgIHJldHVybiBgISR7cGFzc2FibGV9YDtcbiAgICAgICAgfVxuICAgICAgICAvKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuICcjdW5kZWZpbmVkJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhwYXNzYWJsZSk7XG4gICAgICAgIHJldHVybiAvKiogQHR5cGUge2JpZ2ludH0gKi8gKHBhc3NhYmxlKSA8IDBuID8gc3RyIDogYCske3N0cn1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4gYCUke25hbWV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4gICAgICAgIC8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4gICAgICAgIC8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW1xuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICAvKiBUT0RPIGltcGxlbWVudCovXG4gICAgICAgIHRocm93IEZhaWxgbWFyc2FsIG9mIGJ5dGVBcnJheSBub3QgeWV0IGltcGxlbWVudGVkOiAke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJyN0YWcnOiBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyAmJiByZXN1bHQuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlT2JqZWN0fSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIC8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbiAgY29uc3QgZGVjb2RlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+IHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBlbmNvZGluZykge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjID0gZW5jb2RpbmcuY2hhckF0KDApO1xuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlICchJzoge1xuICAgICAgICAgICAgLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG4gICAgICAgICAgICByZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyUnOiB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnIyc6IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgY2FzZSAnI3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyNOYU4nOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyMtSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgICAgICBYYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxcbiAgICAgICAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgIGNhc2UgJy0nOiB7XG4gICAgICAgICAgICByZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihyZXN1bHQpICE9PSAncmVtb3RhYmxlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyYnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdwcm9taXNlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBTcGVjaWFsIGNoYXIgJHtxKFxuICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgKX0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nLm1hcCh2YWwgPT4gZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd24oZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICBjb25zdCB7ICcjdGFnJzogdGFnLCBwYXlsb2FkLCAuLi5yZXN0IH0gPSBlbmNvZGluZztcbiAgICAgICAgICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQoXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duKGVuY29kaW5nLCAnI2Vycm9yJykpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXN1bHQpID09PSAnZXJyb3InIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbZW5jb2RlZE5hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIGVuY29kZWROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsXG4gICAgICAgICAgICApfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICBlbmNvZGVkTmFtZS5jaGFyQXQoMCkgIT09ICcjJyB8fFxuICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGVjb2RlZEVudHJpZXMgPSBlbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxuICAgICAgICAgICAgdHlwZW9mIGVuY29kaW5nLFxuICAgICAgICAgICl9OiAke2VuY29kaW5nfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQnQV6b5CAAC+QgAAKgAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLCJxcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsWCxGYWlsLE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzUHJpbWl0aXZlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1N0cmluZ2FibGVQYXlsb2FkfSBmcm9tICdzZXMnO1xuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHN0cmluZ2lmeTogcXVvdGUgfSA9IEpTT047XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyID0gKCkgPT4ge1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIGxldCBsZXZlbCA9IDA7XG4gIGxldCBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgY29uc3QgbGluZSA9ICgpID0+IHtcbiAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCAnICAnLnJlcGVhdChsZXZlbCkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBvcGVuOiBvcGVuQnJhY2tldCA9PiB7XG4gICAgICBsZXZlbCArPSAxO1xuICAgICAgaWYgKG5lZWRTcGFjZSkge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gICAgfSxcbiAgICBsaW5lLFxuICAgIG5leHQ6IHRva2VuID0+IHtcbiAgICAgIGlmIChuZWVkU3BhY2UgJiYgdG9rZW4gIT09ICcsJyAmJiB0b2tlbiAhPT0gJyknKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBhc3NlcnQobGV2ZWwgPj0gMSk7XG4gICAgICBsZXZlbCAtPSAxO1xuICAgICAgbGluZSgpO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGxldmVsLCAwKTtcbiAgICAgIHJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybiA9IC9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS0gZXJyb3IqL1xuICAgICAgICBpZiAobGFzdC5sZW5ndGggPj0gMSAmJiB0b2tlbi5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIGNvbnN0IHBhaXIgPSBgJHtsYXN0W2xhc3QubGVuZ3RoIC0gMV19JHt0b2tlblswXX1gO1xuICAgICAgICAgIGlmIChiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKSB7XG4gICAgICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSAmJiBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICBzdHJpbmdzLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4gc3RyaW5ncy5qb2luKCcnKSxcbiAgfSk7XG59O1xuXG5jb25zdCBpZGVudFBhdHRlcm4gPSAvXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEBwYXJhbSB7YW55W119IFtzbG90c11cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluID0gKGVuY29kaW5nLCBzaG91bGRJbmRlbnQgPSBmYWxzZSwgc2xvdHMgPSBbXSkgPT4ge1xuICAvKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICBjb25zdCBwcmVwYXJlID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHJhd1RyZWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHRhZywgJ3N0cmluZycpO1xuICAgICAgICAgIHByZXBhcmUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpbmRleCwgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICAgIE5hdChpbmRleCk7XG4gICAgICAgICAgaWYgKGlmYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YoaWZhY2UsICdzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAnb3JpZ2luYWwnIGluIHJhd1RyZWUgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xuICAgICAgICAgIHByZXBhcmUob3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHJlc3QpKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChRQ0xBU1MgaW4gcmVzdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgcHJlcGFyZShyZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGFzc2VydC5mYWlsKFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJhd1RyZWUpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICB9XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VJbmRlbnRlciA9IHNob3VsZEluZGVudCA/IG1ha2VZZXNJbmRlbnRlciA6IG1ha2VOb0luZGVudGVyO1xuICBsZXQgb3V0ID0gbWFrZUluZGVudGVyKCk7XG5cbiAgLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgY29uc3QgZGVjb2RlID0gcmF3VHJlZSA9PiB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICByZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjb2RlUHJvcGVydHkgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICBvdXQubGluZSgpO1xuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykge1xuICAgICAgLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4gICAgICAvKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuICAgICAgLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuICAgICAgLyogSlNPTiBtZWFuaW5nLiovXG4gICAgICBvdXQubmV4dChgW1wiX19wcm90b19fXCJdOmApO1xuICAgIH0gZWxzZSBpZiAoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIG91dC5uZXh0KGAke25hbWV9OmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubmV4dChgJHtxdW90ZShuYW1lKX06YCk7XG4gICAgfVxuICAgIGRlY29kZSh2YWx1ZSk7XG4gICAgb3V0Lm5leHQoJywnKTtcbiAgfTtcblxuICAvKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gIGNvbnN0IHJlY3VyID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHJhd1RyZWUpKSB7XG4gICAgICAvKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgYXNzZXJ0LnR5cGVvZihxY2xhc3MsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICAvKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbiAgICAgIC8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4gICAgICAvKiBlYXJsaWVyLiovXG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICAvKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAvKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihkaWdpdHMsICdzdHJpbmcnKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgcGFzc2FibGVTeW1ib2xGb3JOYW1lKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm5leHQoYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfWApO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG4gICAgICAgICAgY29uc3QgbmVzdGVkUmVuZGVyID0gYXJnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZE91dCA9IG91dDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIG91dCA9IG1ha2VOb0luZGVudGVyKCk7XG4gICAgICAgICAgICAgIGRlY29kZShhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gb3V0LmRvbmUoKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIG91dCA9IG9sZE91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpbmRleCA8IHNsb3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRTbG90ID0gbmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG4gICAgICAgICAgICByZXR1cm4gaWZhY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG91dC5uZXh0KGBzbG90VG9WYWwoJHtyZW5kZXJlZFNsb3R9KWApXG4gICAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3JlbmRlcmVkU2xvdH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlmYWNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0pYClcbiAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KFFDTEFTUywgb3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihyZXN0LCAnb2JqZWN0Jyk7XG4gICAgICAgICAgICBhc3NlcnQocmVzdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICl9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgICAgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY2F1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBjYXVzZSBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBuYW1lICE9PSBgQWdncmVnYXRlRXJyb3JgIHx8XG4gICAgICAgICAgICBGYWlsYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIGVycm9ycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdbXScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ1snKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIG91dC5saW5lKCk7XG4gICAgICAgICAgZGVjb2RlKHJhd1RyZWVbaV0pO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnXScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbiAgICAgIC8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG4gICAgICBjb25zdCBuYW1lcyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKHJhd1RyZWUpKTtcbiAgICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCd7fScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmF3VHJlZVtuYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcHJlcGFyZShlbmNvZGluZyk7XG4gIGRlY29kZShlbmNvZGluZyk7XG4gIHJldHVybiBvdXQuZG9uZSgpO1xufTskaM2PX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG91bGRJbmRlbnRdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVBc0p1c3RpbiA9IChwYXNzYWJsZSwgc2hvdWxkSW5kZW50ID0gdHJ1ZSkgPT4ge1xuICBsZXQgc2xvdENvdW50ID0gMDtcbiAgLyogVXNpbmcgcG9zdC1pbmNyZW1lbnQgYmVsb3cgb25seSBzbyB0aGF0IHRoZSBpbmRleGVzIHN0YXJ0IGF0IHplcm8qL1xuICAvKiBhbmQgdGhlIGBzbG90Q291bnRgIHZhcmlhYmxlIGNhbiBiZSBpbml0aWFsaXplZCB0byBgMGAgcmF0aGVyIHRoYW4qL1xuICAvKiBgLTFgLiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG4gIGNvbnN0IGNvbnZlcnRWYWxUb1Nsb3QgPSB2YWwgPT4gYHMke3Nsb3RDb3VudCsrfWA7XG4gIGNvbnN0IHsgdG9DYXBEYXRhIH0gPSBtYWtlTWFyc2hhbChjb252ZXJ0VmFsVG9TbG90KTtcbiAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gdG9DYXBEYXRhKHBhc3NhYmxlKTtcbiAgY29uc3QgZW5jb2RlZCA9IEpTT04ucGFyc2UoYm9keSk7XG4gIHJldHVybiBkZWNvZGVUb0p1c3RpbihlbmNvZGVkLCBzaG91bGRJbmRlbnQsIHNsb3RzKTtcbn07JGjNj19vbmNlLnBhc3NhYmxlQXNKdXN0aW4ocGFzc2FibGVBc0p1c3Rpbik7XG5oYXJkZW4ocGFzc2FibGVBc0p1c3Rpbik7XG5cbi8qIFRoZSBleGFtcGxlIGJlbG93IGlzIHRoZSBgcGF0dDFgIHRlc3QgY2FzZSBmcm9tIGBxcC1vbi1wYXR0ZXJuLnRlc3QuanNgLiovXG4vKiBQbGVhc2UgY28tbWFpbnRhaW4gdGhlIGZvbGxvd2luZyBkb2MtY29tbWVudCBhbmQgdGhhdCB0ZXN0IG1vZHVsZS4qL1xuLyoqXG4gKiBgcXBgIGZvciBxdW90ZSBwYXNzYWJsZSBhcyBhIHF1YXNpLXF1b3RlZCBKdXN0aW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBCb3RoIGBxYCBmcm9tIGBAZW5kby9lcnJvcnNgIGFuZCB0aGlzIGBxcGAgZnJvbSBgQGVuZG8vbWFyc2hhbGAgY2FuXG4gKiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYEZhaWxgLCBgWGAsIGV0YyBmcm9tIGBAZW5kby9lcnJvcnNgIHRvIG1hcmtcbiAqIGEgc3Vic3RpdHV0aW9uIHZhbHVlIHRvIGJlIGJvdGhcbiAqIC0gdmlzdWFsbHkgcXVvdGVkIGluIHNvbWUgdXNlZnVsIG1hbm5lclxuICogLSB1bnJlZGFjdGVkXG4gKlxuICogRGlmZmVyZW5jZXM6XG4gKiAtIGdpdmVuIGEgcGF0dGVybiBgTS5hbmQoTS5ndGUoLTEwMCksIE0ubHRlKDEwMCkpYCxcbiAqICAgYGBganNcbiAqICAgYCR7cShwYXR0KX1gXG4gKiAgIGBgYFxuICogICBwcm9kdWNlcyBgXCJbbWF0Y2g6YW5kXVwiYCwgd2hlcmVhc1xuICogICBgYGBqc1xuICogICBgJHtxcChwYXR0KX1gXG4gKiAgIGBgYFxuICogICBwcm9kdWNlcyBxdWFzaS1xdW90ZXMgSnVzdGluIG9mIHdoYXQgd291bGQgYmUgcGFzc2VkOlxuICogICBgYGBqc1xuICogICBgbWFrZVRhZ2dlZChcIm1hdGNoOmFuZFwiLCBbXG4gKiAgICAgbWFrZVRhZ2dlZChcIm1hdGNoOmd0ZVwiLCAtMTAwKSxcbiAqICAgICBtYWtlVGFnZ2VkKFwibWF0Y2g6bHRlXCIsIDEwMCksXG4gKiAgIF0pYFxuICogICBgYGBcbiAqIC0gYHFgIGlzIGxhenksIG1pbmltaXppbmcgdGhlIGNvc3QgZm9yIHVzaW5nIGl0IGluIGFuIGVycm9yIHRoYXQncyBuZXZlclxuICogICBsb2dnZWQuIFVuZm9ydHVuYXRlbHksIGR1ZSB0byBsYXllcmluZyBjb25zdHJhaW50cywgYHFwYCBpcyBub3RcbiAqICAgbGF6eSwgYWx3YXlzIHJlbmRlcmluZyB0byBxdWFzaS1xdW90ZWQgSnVzdGluIGltbWVkaWF0ZWx5LlxuICpcbiAqIFNpbmNlIEp1c3RpbiBpcyBhIHN1YnNldCBvZiBIYXJkZW5lZEpTLCBuZWl0aGVyIHRoZSBuYW1lIGBxcGAgbm9yIHRoZVxuICogcmVuZGVyZWQgZm9ybSBuZWVkIHRvIG1ha2UgY2xlYXIgdGhhdCB0aGUgcmVuZGVyZWQgZm9ybSBpcyBpbiBKdXN0aW4gcmF0aGVyXG4gKiB0aGFuIEhhcmRlbmVkSlMuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF5bG9hZFxuICogQHJldHVybnMge1N0cmluZ2FibGVQYXlsb2FkfVxuICovXG4gICAgICAgY29uc3QgcXAgPSBwYXlsb2FkID0+IGBcXGAke3Bhc3NhYmxlQXNKdXN0aW4oaGFyZGVuKHBheWxvYWQpLCB0cnVlKX1cXGBgOyRozY9fb25jZS5xcChxcCk7XG5oYXJkZW4ocXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXSwicGFzc2FibGVBc0p1c3RpbiI6WyJwYXNzYWJsZUFzSnVzdGluIl0sInFwIjpbInFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKtxgfihCQAAoQkAAC0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3QgPSB2YWwgPT5cbiAgRmFpbGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbCA9IChzbG90LCBfaWZhY2UpID0+XG4gIEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlciA9IGhhcmRlbih7XG4gIGdldDogKF90YXJnZXQsIG5hbWUsIF9yZWNlaXZlcikgPT4ge1xuICAgIGlmIChuYW1lID09PSAnbGVuZ3RoJykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICB0aHJvdyBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuICB9LFxufSk7XG5cbi8qKlxuICogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCB0aGUgcHJveHkgdGFyZ2V0IHNvIGl0IHJlbWFpbnMgdHJhcHBpbmcuXG4gKiBUaHVzLCBpdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kXG4gKi9cbmNvbnN0IGFycmF5VGFyZ2V0ID0gZnJlZXplKC8qKiBAdHlwZSB7YW55W119ICovIChbXSkpO1xuY29uc3QgYmFkQXJyYXkgPSBuZXcgUHJveHkoYXJyYXlUYXJnZXQsIGJhZEFycmF5SGFuZGxlcik7XG5cbmNvbnN0IHsgc2VyaWFsaXplLCB1bnNlcmlhbGl6ZSB9ID0gbWFrZU1hcnNoYWwoXG4gIGRvTm90Q29udmVydFZhbFRvU2xvdCxcbiAgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nOiAnb2ZmJyxcbiAgICAvKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdjYXBkYXRhJyxcbiAgfSxcbik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnkgPSB2YWwgPT4gc2VyaWFsaXplKHZhbCkuYm9keTskaM2PX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlID0gc3RyID0+XG4gIHVuc2VyaWFsaXplKFxuICAgIC8qIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgc2luY2UgdGhlIGBiYWRBcnJheWAgcHJveHkgYW5kIGl0cyB0YXJnZXQqL1xuICAgIC8qIG11c3QgcmVtYWluIHRyYXBwaW5nLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZCovXG4gICAgZnJlZXplKHtcbiAgICAgIGJvZHk6IHN0cixcbiAgICAgIHNsb3RzOiBiYWRBcnJheSxcbiAgICB9KSxcbiAgKTskaM2PX29uY2UucGFyc2UocGFyc2UpO1xuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZViFtXw/AAB8PwAAIwAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsdG9QYXNzYWJsZUVycm9yLFgsRmFpbCxxLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLG9iamVjdE1hcCxRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1widG9QYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAodG9QYXNzYWJsZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRozY9fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnZlcnRTbG90VG9WYWwsIENvbnZlcnRWYWxUb1Nsb3QsIEZyb21DYXBEYXRhLCBNYWtlTWFyc2hhbE9wdGlvbnMsIFRvQ2FwRGF0YX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUGFzc2FibGVDYXAsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0VuY29kaW5nfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm4gPSB4ID0+IHg7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbiA9ICh4LCBfKSA9PiB4O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFyc2hhbCA9IChcbiAgY29udmVydFZhbFRvU2xvdCA9IGRlZmF1bHRWYWxUb1Nsb3RGbixcbiAgY29udmVydFNsb3RUb1ZhbCA9IGRlZmF1bHRTbG90VG9WYWxGbixcbiAge1xuICAgIGVycm9yVGFnZ2luZyA9ICdvbicsXG4gICAgbWFyc2hhbE5hbWUgPSAnYW5vbi1tYXJzaGFsJyxcbiAgICAvKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG4gICAgZXJyb3JJZE51bSA9IDEwMDAwLFxuICAgIC8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4gICAgLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xuICAgIG1hcnNoYWxTYXZlRXJyb3IgPSBlcnIgPT5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgICAvKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuICAgIC8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0ID0gJ2NhcGRhdGEnLFxuICB9ID0ge30sXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwgJ3N0cmluZycpO1xuICBlcnJvclRhZ2dpbmcgPT09ICdvbicgfHxcbiAgICBlcnJvclRhZ2dpbmcgPT09ICdvZmYnIHx8XG4gICAgRmFpbGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuICBjb25zdCBuZXh0RXJyb3JJZCA9ICgpID0+IHtcbiAgICBlcnJvcklkTnVtICs9IDE7XG4gICAgcmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiAgfTtcblxuICAvKipcbiAqIEB0eXBlIHtUb0NhcERhdGE8U2xvdD59XG4gKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gcm9vdCA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbiAgICBjb25zdCBlbmNvZGVTbG90Q29tbW9uID0gcGFzc2FibGUgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gc2xvdE1hcC5nZXQocGFzc2FibGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG4gICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gc2xvdHMubGVuZ3RoO1xuICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuICAgICAgc2xvdHMucHVzaChzbG90KTtcbiAgICAgIHNsb3RNYXAuc2V0KHBhc3NhYmxlLCBpbmRleCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG4gICAgY29uc3QgZW5jb2RlRXJyb3JDb21tb24gPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVuY29kZVJlY3VyKGAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBuYW1lID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm5hbWV9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgIC8qIFRPRE8gTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AsIGJ1dCovXG4gICAgICAvKiBvbmx5IG9uY2UgYWxsIHBvc3NpYmxlIGNvdW50ZXJwYXJ0eSBkZWNvZGVycyBhcmUgdG9sZXJhbnQgb2YqL1xuICAgICAgLyogcmVjZWl2aW5nIHRoZW0uKi9cbiAgICAgIGlmIChlcnJvclRhZ2dpbmcgPT09ICdvbicpIHtcbiAgICAgICAgLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4gICAgICAgIC8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbiAgICAgICAgLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbiAgICAgICAgLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4gICAgICAgIC8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbiAgICAgICAgLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4gICAgICAgIC8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSBlbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihlcnJvcklkLCAnc3RyaW5nJyk7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJyLCBYYFNlbnQgYXMgJHtlcnJvcklkfWApO1xuICAgICAgICBtYXJzaGFsU2F2ZUVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBlcnJvcklkLCBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnY2FwZGF0YScpIHtcbiAgICAgIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhID0gKHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKiogQHR5cGUgeyhwcm9taXNlOiBSZW1vdGFibGVPYmplY3QsIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nKSA9PiBFbmNvZGluZ30gKi9cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9ICh2YWwsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsIGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG4gICAgICAvKiogQHR5cGUgeyhwcm9taXNlOiBQcm9taXNlLCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZykgPT4gRW5jb2Rpbmd9ICovXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuICAgICAgLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ2Vycm9yJywgLi4uZXJyRGF0YSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IG1ha2VFbmNvZGVUb0NhcERhdGEoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZUVycm9yVG9DYXBEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb0NhcERhdGEocm9vdCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdzbWFsbGNhcHMnKSB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2FwcyA9IChwcmVmaXgsIHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIC8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSAocmVtb3RhYmxlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcsIHJlbW90YWJsZSwgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicsIHByb21pc2UpO1xuXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLnJlc3QgfSA9IGVyckRhdGE7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdCB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gbWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4gICAgICAgIC8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuICAgICAgICBib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbiAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlRnVsbFJldml2ZSA9IHNsb3RzID0+IHtcbiAgICAvKiogQHR5cGUge01hcDxudW1iZXIsIFJlbW90YWJsZU9iamVjdCB8IFByb21pc2U+fSAqL1xuICAgIGNvbnN0IHZhbE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZU9iamVjdCB8IFByb21pc2V9XG4gKi9cbiAgICBjb25zdCBkZWNvZGVTbG90Q29tbW9uID0gc2xvdERhdGEgPT4ge1xuICAgICAgY29uc3QgeyBpZmFjZSA9IHVuZGVmaW5lZCwgaW5kZXgsIC4uLnJlc3QgfSA9IHNsb3REYXRhO1xuICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgY29uc3QgZXh0YW50ID0gdmFsTWFwLmdldChpbmRleCk7XG4gICAgICBpZiAoZXh0YW50KSB7XG4gICAgICAgIHJldHVybiBleHRhbnQ7XG4gICAgICB9XG4gICAgICAvKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4gICAgICAvKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnZlcnRTbG90VG9WYWwoc2xvdCwgaWZhY2UpO1xuICAgICAgdmFsTWFwLnNldChpbmRleCwgdmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qKlxuICogQHBhcmFtIHt7XG4gKiAgIGVycm9ySWQ/OiBzdHJpbmcsXG4gKiAgIG1lc3NhZ2U6IHN0cmluZyxcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjYXVzZTogdW5rbm93bixcbiAqICAgZXJyb3JzOiB1bmtub3duLFxuICogfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbiAgICBjb25zdCBkZWNvZGVFcnJvckNvbW1vbiA9IChlcnJEYXRhLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBlcnJvcklkID0gdW5kZWZpbmVkLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkLFxuICAgICAgICAuLi5yZXN0XG4gICAgICB9ID0gZXJyRGF0YTtcbiAgICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDUyKi9cbiAgICAgIC8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY2FsbHMqL1xuICAgICAgLyogdG8gYGRlY29kZVJlY3VyYCBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCovXG4gICAgICAvKiBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuICAgICAgY29uc3QgZE5hbWUgPSBkZWNvZGVSZWN1cihuYW1lKTtcbiAgICAgIGNvbnN0IGRNZXNzYWdlID0gZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4gICAgICAvKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuICAgICAgY29uc3QgZEVycm9ySWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICBkRXJyb3JJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICA6IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgIHNhbml0aXplOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoY2F1c2UpIHtcbiAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGRlY29kZVJlY3VyKGNhdXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvcnMgPSBkZWNvZGVSZWN1cihlcnJvcnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3RXJyb3IgPSBtYWtlRXJyb3IoZE1lc3NhZ2UsIGVyckNvbnN0cnVjdG9yLCBvcHRpb25zKTtcbiAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRlY29kZVJlY3VyIHJlc3QncyBwcm9wZXJ0eSBuYW1lcy4qL1xuICAgICAgLyogVGhpcyB3b3VsZCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBzbWFsbGNhcHMnIGV4cGVjdGVkIGhhbmRsaW5nLCovXG4gICAgICAvKiBidXQgaXMgZmluZSBoZXJlIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBmb3IgYGFubm90YXRlRXJyb3JgLCovXG4gICAgICAvKiB3aGljaCBpcyBmb3IgZGlhZ25vc3RpYyBpbmZvIHRoYXQgaXMgb3RoZXJ3aXNlIHVub2JzZXJ2YWJsZS4qL1xuICAgICAgY29uc3QgZGVzY3MgPSBvYmplY3RNYXAocmVzdCwgZGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogZGVjb2RlUmVjdXIoZGF0YSksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJhd0Vycm9yLCBkZXNjcyk7XG4gICAgICBoYXJkZW4ocmF3RXJyb3IpO1xuICAgICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gICAgfTtcblxuICAgIC8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuICAgIC8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4gICAgLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuICAgIC8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLnNsb3REYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gKHJhd1RyZWUsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5lcnJEYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbUNhcERhdGEgPSBtYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMgPSBwcmVmaXggPT4ge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlfVxuICovXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG4gICAgICAgIGNvbnN0IGkgPSBzdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsIGkgPCAwID8gdW5kZWZpbmVkIDogaSkpO1xuICAgICAgICAvKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbiAgICAgICAgY29uc3QgaWZhY2UgPSBpIDwgMCA/IHVuZGVmaW5lZCA6IHN0cmluZ0VuY29kaW5nLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oeyBpZmFjZSwgaW5kZXggfSk7XG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuICAgIGNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSAoZW5jb2RpbmcsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9ID0gZW5jb2Rpbmc7XG4gICAgICAhaGFzT3duKHJlc3RFcnJEYXRhLCAnbWVzc2FnZScpIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oeyBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9LCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG4gICAgICAvKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuICAgICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZSB7RnJvbUNhcERhdGE8U2xvdD59XG4gKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IGJvZHksIHNsb3RzIH0gPSBkYXRhO1xuICAgIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG4gICAgaXNBcnJheShkYXRhLnNsb3RzKSB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuICAgIGNvbnN0IHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSA9IG1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIC8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG4gICAgaWYgKGJvZHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBib2R5LnNsaWNlKDEpO1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBoYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdUcmVlID0gaGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4gICAgLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4gICAgLyogdG8gc21hbGxjYXBzLiovXG4gICAgYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzYWJsZUNhcH0gKi8gKHJlc3VsdCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgdG9DYXBEYXRhLFxuICAgIGZyb21DYXBEYXRhLFxuXG4gICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuICAgIHNlcmlhbGl6ZTogdG9DYXBEYXRhLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbiAgICB1bnNlcmlhbGl6ZTogZnJvbUNhcERhdGEsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgaK+MehZAADoWQAAJQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRlbnYsRmFpbCxxLGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0ZW52ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsIFBhc3NTdHlsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBQYXJ0aWFsQ29tcGFyZSwgUGFydGlhbENvbXBhcmlzb24sIFJhbmtDb21wYXJlLCBSYW5rQ29tcGFyaXNvbiwgUmFua0NvdmVyfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgaXNOYU46IE51bWJlcklzTmFOIH0gPSBOdW1iZXI7XG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBzZXRQcm90b3R5cGVPZiwgaXMgfSA9IE9iamVjdDtcblxuY29uc3QgRU5ET19SQU5LX1NUUklOR1MgPSBnZXRlbnYoJ0VORE9fUkFOS19TVFJJTkdTJywgJ3V0ZjE2LWNvZGUtdW5pdC1vcmRlcicsIFtcbiAgJ3VuaWNvZGUtY29kZS1wb2ludC1vcmRlcicsXG4gICdlcnJvci1pZi1vcmRlci1jaG9pY2UtbWF0dGVycycsXG5dKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gdXNlZCBieSBKYXZhU2NyaXB0J3MgTWFwIGFuZCBTZXRcbiAqIGFic3RyYWN0aW9ucywgd2hlcmUgTmFOIGlzIHRoZSBzYW1lIGFzIE5hTiBhbmQgLTAgaXMgdGhlIHNhbWUgYXNcbiAqIDAuIE1hcnNoYWwgc2VyaWFsaXplcyAtMCBhcyB6ZXJvLCBzbyB0aGUgc2VtYW50aWNzIG9mIG91ciBkaXN0cmlidXRlZFxuICogb2JqZWN0IHN5c3RlbSBkb2VzIG5vdCBkaXN0aW5ndWlzaCAwIGZyb20gLTAuXG4gKlxuICogYHNhbWVWYWx1ZVplcm9gIGlzIHRoZSBFY21hU2NyaXB0IHNwZWMgbmFtZSBmb3IgdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uLFxuICogYnV0IFRPRE8gd2UgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGUgQVBJLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4XG4gKiBAcGFyYW0ge2FueX0geVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm8gPSAoeCwgeSkgPT4geCA9PT0geSB8fCBpcyh4LCB5KTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbGVmdFxuICogQHBhcmFtIHthbnl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PlxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPT09IHJpZ2h0ID8gMCA6IDE7XG5oYXJkZW4odHJpdmlhbENvbXBhcmF0b3IpO1xuXG4vKiBBcHBhcmVudGx5IGVzbGludCBjb25mdXNlZCBhYm91dCB3aGV0aGVyIHRoZSBmdW5jdGlvbiBjYW4gZXZlciBleGl0Ki9cbi8qIHdpdGhvdXQgYW4gZXhwbGljaXQgcmV0dXJuLiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrKi9cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxlZnRcbiAqIEBwYXJhbSB7c3RyaW5nfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG4gICAgICAgY29uc3QgY29tcGFyZUJ5Q29kZVBvaW50cyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBjb25zdCBsZWZ0SXRlciA9IGxlZnRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICBjb25zdCByaWdodEl0ZXIgPSByaWdodFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IHZhbHVlOiBsZWZ0Q2hhciB9ID0gbGVmdEl0ZXIubmV4dCgpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHJpZ2h0Q2hhciB9ID0gcmlnaHRJdGVyLm5leHQoKTtcbiAgICBpZiAobGVmdENoYXIgPT09IHVuZGVmaW5lZCAmJiByaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChsZWZ0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiBsZWZ0IGlzIGEgcHJlZml4IG9mIHJpZ2h0LiovXG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogcmlnaHQgaXMgYSBwcmVmaXggb2YgbGVmdC4qL1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRDb2RlcG9pbnQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGxlZnRDaGFyLmNvZGVQb2ludEF0KDApKTtcbiAgICBjb25zdCByaWdodENvZGVwb2ludCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmlnaHRDaGFyLmNvZGVQb2ludEF0KDApKTtcbiAgICBpZiAobGVmdENvZGVwb2ludCA8IHJpZ2h0Q29kZXBvaW50KSByZXR1cm4gLTE7XG4gICAgaWYgKGxlZnRDb2RlcG9pbnQgPiByaWdodENvZGVwb2ludCkgcmV0dXJuIDE7XG4gIH1cbn07JGjNj19vbmNlLmNvbXBhcmVCeUNvZGVQb2ludHMoY29tcGFyZUJ5Q29kZVBvaW50cyk7XG5oYXJkZW4oY29tcGFyZUJ5Q29kZVBvaW50cyk7XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc2FtZS10eXBlIG51bWVyaWMgdmFsdWVzLCByZXR1cm5pbmcgcmVzdWx0cyBjb25zaXN0ZW50IHdpdGhcbiAqIGBjb21wYXJlUmFua2AncyBcInJhbmsgb3JkZXJcIiAoaS5lLiwgdHJlYXRpbmcgYm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgemVyb1xuICogYXMgZXF1YWwgYW5kIHBsYWNpbmcgTmFOIGFzIHNlbGYtZXF1YWwgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMpLlxuICpcbiAqIEB0ZW1wbGF0ZSB7bnVtYmVyIHwgYmlnaW50fSBUXG4gKiBAcGFyYW0ge1R9IGxlZnRcbiAqIEBwYXJhbSB7VH0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVOdW1lcmljcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gIGlmIChsZWZ0IDwgcmlnaHQpIHJldHVybiAtMTtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBpZiAobGVmdCA+IHJpZ2h0KSByZXR1cm4gMTtcbiAgaWYgKE51bWJlcklzTmFOKGxlZnQpID09PSBOdW1iZXJJc05hTihyaWdodCkpIHJldHVybiAwO1xuICBpZiAoTnVtYmVySXNOYU4ocmlnaHQpKSByZXR1cm4gLTE7XG4gIGFzc2VydChOdW1iZXJJc05hTihsZWZ0KSk7XG4gIHJldHVybiAxO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFBhc3NTdHlsZSwgeyBpbmRleDogbnVtYmVyLCBjb3ZlcjogUmFua0NvdmVyIH0+fSBQYXNzU3R5bGVSYW5rc1JlY29yZFxuICovJGjNj19vbmNlLmNvbXBhcmVOdW1lcmljcyhjb21wYXJlTnVtZXJpY3MpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcyA9IC8qKiBAdHlwZSB7UGFzc1N0eWxlUmFua3NSZWNvcmR9ICovIChcbiAgZnJvbUVudHJpZXMoXG4gICAgZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbiAgICAgIC8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LCBhc3N1bWluZyB0aGF0IGFsbCBwcmVmaXhlcyBhcmUqL1xuICAgICAgLyogbGltaXRlZCB0byB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChVKzAwMDAgdGhyb3VnaCBVK0ZGRkYpIGFuZCovXG4gICAgICAvKiB0aHVzIGNvbnRhaW4gb25seSBjb2RlIHVuaXRzIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8gY29kZSBwb2ludHMuKi9cbiAgICAgIC8qIEluIHByYWN0aWNlLCB0aGV5IGFyZSBlbnRpcmVseSBwcmludGFibGUgQVNDSUkqL1xuICAgICAgLyogKDB4MjAgU1BBQ0UgdGhyb3VnaCAweDdFIFRJTERFKS4qL1xuICAgICAgLnNvcnQoKFtfbGVmdFN0eWxlLCBsZWZ0UHJlZml4ZXNdLCBbX3JpZ2h0U3R5bGUsIHJpZ2h0UHJlZml4ZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMsIHJpZ2h0UHJlZml4ZXMpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKFtwYXNzU3R5bGUsIHByZWZpeGVzXSwgaW5kZXgpID0+IHtcbiAgICAgICAgLyogVmVyaWZ5IHRoYXQgYHByZWZpeGVzYCBpcyBzb3J0ZWQsIGFuZCBjb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0Ki9cbiAgICAgICAgLyogd2l0aCBhbnkgb2YgaXRzIGNoYXJhY3RlcnMsIGkuZS4qL1xuICAgICAgICAvKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xuICAgICAgICBwcmVmaXhlcyA9PT0gcHJlZml4ZXMuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICAgIEZhaWxgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbiAgICAgICAgY29uc3QgY292ZXIgPSBbXG4gICAgICAgICAgcHJlZml4ZXMuY2hhckF0KDApLFxuICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGggLSAxKSArIDEpLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gW3Bhc3NTdHlsZSwgeyBpbmRleCwgY292ZXIgfV07XG4gICAgICB9KSxcbiAgKVxuKTtcbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldFBhc3NTdHlsZUNvdmVyID0gcGFzc1N0eWxlID0+IHBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjNj19vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhcnRpYWxDb21wYXJlfSBbY29tcGFyZVJlbW90YWJsZXNdXG4gKiBBIGNvbXBhcmF0b3IgZm9yIGFzc2lnbmluZyBhbiBpbnRlcm5hbCBvcmRlciB0byByZW1vdGFibGVzLlxuICogSXQgZGVmYXVsdHMgdG8gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGBOYU5gLCBtZWFuaW5nIHRoYXQgYWxsXG4gKiByZW1vdGFibGVzIGFyZSBpbmNvbXBhcmFibGUgYW5kIHNob3VsZCB0aWUgZm9yIHRoZSBzYW1lIHJhbmsgYnlcbiAqIHNob3J0LWNpcmN1aXRpbmcgd2l0aG91dCBmdXJ0aGVyIHJlZmluZW1lbnQgKGUuZy4sIG5vdCBvbmx5IGFyZSBgcjFgIGFuZCBgcjJgXG4gKiB0aWVkLCBidXQgc28gYXJlIGBbcjEsIDBdYCBhbmQgYFtyMiwgXCJ4XCJdYCkuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyYXRvcktpdCA9IChjb21wYXJlUmVtb3RhYmxlcyA9IChfeCwgX3kpID0+IE5hTikgPT4ge1xuICAvKiogQHR5cGUge1BhcnRpYWxDb21wYXJlfSAqL1xuICBjb25zdCBjb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgaWYgKHNhbWVWYWx1ZVplcm8obGVmdCwgcmlnaHQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gICAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgICByZXR1cm4gY29tcGFyZU51bWVyaWNzKFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS1cbiAqIFdlIGtub3cgYGxlZnRgIGFuZCBgcmlnaHRgIGFyZSBjb21wYXJhYmxlLlxuICovXG4gICAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIC8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbiAgICAgICAgLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuICAgICAgICAvKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgc3dpdGNoIChFTkRPX1JBTktfU1RSSU5HUykge1xuICAgICAgICAgIGNhc2UgJ3V0ZjE2LWNvZGUtdW5pdC1vcmRlcic6IHtcbiAgICAgICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3VuaWNvZGUtY29kZS1wb2ludC1vcmRlcic6IHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlQnlDb2RlUG9pbnRzKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZXJyb3ItaWYtb3JkZXItY2hvaWNlLW1hdHRlcnMnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQxID0gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0MiA9IGNvbXBhcmVCeUNvZGVQb2ludHMobGVmdCwgcmlnaHQpO1xuICAgICAgICAgICAgcmVzdWx0MSA9PT0gcmVzdWx0MiB8fFxuICAgICAgICAgICAgICBGYWlsYENvbXBhcmlzb25zIGRpZmZlcmVkOiAke2xlZnR9IHZzICR7cmlnaHR9LCAke3EocmVzdWx0MSl9IHZzICR7cShyZXN1bHQyKX1gO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgVW5leHBlY3RlZCBFTkRPX1JBTktfU1RSSU5HUyAke3EoRU5ET19SQU5LX1NUUklOR1MpfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyZU51bWVyaWNzKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuICAgICAgICAvKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbiAgICAgICAgLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4gICAgICAgIC8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4gICAgICAgIC8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuICAgICAgICAvKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbiAgICAgICAgLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuICAgICAgICAvKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuICAgICAgICAvKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4gICAgICAgIC8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogTGV4aWNvZ3JhcGhpYyovXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuICAgICAgICAvKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogQnl0ZUFycmF5cyBjb21wYXJlIGJ5IHNob3J0bGV4LiovXG4gICAgICAgIC8qIC0gZmlyc3QsIGlmIHRoZXkgYXJlIG9mIHVuZXF1YWwgbGVuZ3RoLCB0aGVuIHRoZSBzaG9ydGVyIGlzIGxlc3MuKi9cbiAgICAgICAgLyogLSB0aGVuLCBhbW9uZyBieXRlQXJyYXlzIG9mIGVxdWFsIGxlbmd0aCwgYnkgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uKi9cbiAgICAgICAgLyogb2YgdGhlaXIgYnl0ZXMgaW4gYXNjZW5kaW5nIG9yZGVyLiovXG4gICAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aDogbGVmdExlbiB9ID0gbGVmdDtcbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoOiByaWdodExlbiB9ID0gcmlnaHQ7XG4gICAgICAgIGlmIChsZWZ0TGVuIDwgcmlnaHRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlZnRMZW4gPiByaWdodExlbikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQWNjb3VudCBmb3IgZ2FwcyBpbiB0aGUgQGVuZG8vaW1tdXRhYmxlLWFycmF5YnVmZmVyIHNoaW0uKi9cbiAgICAgICAgY29uc3QgbGVmdEFycmF5ID1cbiAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YobGVmdCkgPT09IEFycmF5QnVmZmVyLnByb3RvdHlwZVxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShsZWZ0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShsZWZ0LnNsaWNlKDApKTtcbiAgICAgICAgY29uc3QgcmlnaHRBcnJheSA9XG4gICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJpZ2h0KSA9PT0gQXJyYXlCdWZmZXIucHJvdG90eXBlXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KHJpZ2h0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShyaWdodC5zbGljZSgwKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdExlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbGVmdEJ5dGUgPSBsZWZ0QXJyYXlbaV07XG4gICAgICAgICAgY29uc3QgcmlnaHRCeXRlID0gcmlnaHRBcnJheVtpXTtcbiAgICAgICAgICBpZiAobGVmdEJ5dGUgPCByaWdodEJ5dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxlZnRCeXRlID4gcmlnaHRCeXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbiAgICAgICAgY29uc3QgbGFiZWxDb21wID0gY29tcGFyYXRvcihnZXRUYWcobGVmdCksIGdldFRhZyhyaWdodCkpO1xuICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ29tcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgfTtcblxuICAvKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuICBjb25zdCBvdXRlckNvbXBhcmF0b3IgPSAoeCwgeSkgPT5cbiAgICAvKiBXaGVuIHRoZSBpbm5lciBjb21wYXJhdG9yIHJldHVybnMgTmFOIHRvIGluZGljYXRlIGluY29tcGFyYWJpbGl0eSwqL1xuICAgIC8qIHJlcGxhY2UgdGhhdCB3aXRoIDAgdG8gaW5kaWNhdGUgYSB0aWUuKi9cbiAgICAvKiogQHR5cGUge0V4Y2x1ZGU8UGFydGlhbENvbXBhcmlzb24sIE5hTj59ICovIChjb21wYXJhdG9yKHgsIHkpIHx8IDApO1xuXG4gIC8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG4gIGNvbnN0IGFudGlDb21wYXJhdG9yID0gKHgsIHkpID0+IG91dGVyQ29tcGFyYXRvcih5LCB4KTtcblxuICBtZW1vT2ZTb3J0ZWQuc2V0KG91dGVyQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIG1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsIG91dGVyQ29tcGFyYXRvcik7XG5cbiAgcmV0dXJuIGhhcmRlbih7IGNvbXBhcmF0b3I6IG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IgfSk7XG59O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbiAgICAgICBjb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSBjb21wYXJhdG9yID0+XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbiAgICAgICBjb25zdCBpc1JhbmtTb3J0ZWQgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIGlmIChzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKSA9PT0gJ2NvcHlBcnJheScpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHBhc3NhYmxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjb21wYXJlKHBhc3NhYmxlc1tpIC0gMV0sIHBhc3NhYmxlc1tpXSkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmFua1NvcnRlZCA9IChzb3J0ZWQsIGNvbXBhcmUpID0+XG4gIGlzUmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpIHx8XG4gIC8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIEZhaWxgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsIGNvbXBhcmUpfWA7JGjNj19vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gICAgICAgY29uc3Qgc29ydEJ5UmFuayA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgLyoqIEB0eXBlIHtUW119IG11dGFibGUgZm9yIGluLXBsYWNlIHNvcnRpbmcsIGJ1dCB3aXRoIGhhcmRlbmVkIGVsZW1lbnRzICovXG4gIGxldCB1bnNvcnRlZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSkge1xuICAgIGhhcmRlbihwYXNzYWJsZXMpO1xuICAgIC8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuICAgIC8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbiAgICAvKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbiAgICBpZiAoaXNSYW5rU29ydGVkKHBhc3NhYmxlcywgY29tcGFyZSkpIHtcbiAgICAgIHJldHVybiBwYXNzYWJsZXM7XG4gICAgfVxuICAgIHVuc29ydGVkID0gWy4uLnBhc3NhYmxlc107XG4gIH0gZWxzZSB7XG4gICAgdW5zb3J0ZWQgPSBBcnJheS5mcm9tKHBhc3NhYmxlcywgaGFyZGVuKTtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSB1bnNvcnRlZC5zb3J0KGNvbXBhcmUpO1xuICAvKiBGb3IgcmV2ZXJzZSBjb21wYXJpc29uLCBtb3ZlIGB1bmRlZmluZWRgIHZhbHVlcyBmcm9tIHRoZSBlbmQgdG8gdGhlIHN0YXJ0LiovXG4gIC8qIE5vdGUgdGhhdCBwYXNzU3R5bGVQcmVmaXhlcyAoQHNlZSB7QGxpbmsgLi9lbmNvZGVQYXNzYWJsZS5qc30pIE1VU1QgTk9UKi9cbiAgLyogc29ydCBhbnkgY2F0ZWdvcnkgYWZ0ZXIgYHVuZGVmaW5lZGAuKi9cbiAgaWYgKGNvbXBhcmUodHJ1ZSwgdW5kZWZpbmVkKSA+IDApIHtcbiAgICBsZXQgaSA9IHNvcnRlZC5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChpID49IDAgJiYgc29ydGVkW2ldID09PSB1bmRlZmluZWQpIGkgLT0gMTtcbiAgICBjb25zdCBuID0gc29ydGVkLmxlbmd0aCAtIGkgLSAxO1xuICAgIGlmIChuID4gMCAmJiBuIDwgc29ydGVkLmxlbmd0aCkge1xuICAgICAgc29ydGVkLmNvcHlXaXRoaW4obiwgMCk7XG4gICAgICBzb3J0ZWQuZmlsbCgvKiogQHR5cGUge1R9ICovICh1bmRlZmluZWQpLCAwLCBuKTtcbiAgICB9XG4gIH1cbiAgaGFyZGVuKHNvcnRlZCk7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbiAgcmV0dXJuIHNvcnRlZDtcbn07JGjNj19vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2ggPSAoc29ydGVkLCBjb21wYXJlLCBrZXksIGJpYXMgPSAnbGVmdE1vc3QnKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBzb3J0ZWQubGVuZ3RoO1xuICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcbiAgICBjb25zdCBjb21wID0gY29tcGFyZShzb3J0ZWRbbV0sIGtleSk7XG4gICAgaWYgKGNvbXAgPD0gLTEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ3JpZ2h0TW9zdCcpKSB7XG4gICAgICBsZWZ0ID0gbSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChjb21wID49IDEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ2xlZnRNb3N0JykpO1xuICAgICAgcmlnaHQgPSBtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmlhcyA9PT0gJ2xlZnRNb3N0JyA/IGxlZnQgOiByaWdodCAtIDE7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCB1bmlvblJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4gIC8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuICAvKiBhcyB0aGUgTWFwLiovXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUJ5Q29kZVBvaW50cyI6WyJjb21wYXJlQnlDb2RlUG9pbnRzIl0sImNvbXBhcmVOdW1lcmljcyI6WyJjb21wYXJlTnVtZXJpY3MiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4xDdI0kMAABJDAAAHQAAAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwbikge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsZWdlZE51bTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuICAgIH1cbiAgICBpZiAoYWxsZWdlZE51bSA8IDApIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiAgfVxuXG4gIHRocm93IFR5cGVFcnJvcihcbiAgICBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCxcbiAgKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbm7eczYLAAA2CwAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9zdHJpbmcuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9zdHJpbmcuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJpc1ByaW1pdGl2ZSIsImlzUHJpbWl0aXZlIl0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sWyJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9zdHJpbmcuanMiOltbImlzV2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0UGFzc2FibGVTdHJpbmciXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJ0b1Rocm93YWJsZSIsInRvVGhyb3dhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdLFsiR0VUX01FVEhPRF9OQU1FUyIsIkdFVF9NRVRIT0RfTkFNRVMiXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXSxbImlzQXRvbSIsImlzQXRvbSJdLFsiYXNzZXJ0QXRvbSIsImFzc2VydEF0b20iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6FbiMVDQAAFQ0AACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvYnl0ZUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkJ5dGVBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMsIGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKiBEZXRlY3RzIHRoZSBwcmVzZW5jZSBvZiBhIGltbXV0YWJsZSBBcnJheUJ1ZmZlciBzdXBwb3J0IGluIHRoZSB1bmRlcmx5aW5nKi9cbi8qIHBsYXRmb3JtIGFuZCBwcm92aWRlcyBlaXRoZXIgc3VpdGFibGUgdmFsdWVzIGZyb20gdGhhdCBpbXBsZW1lbnRhdGlvbiBvciovXG4vKiB2YWx1ZXMgdGhhdCB3aWxsIGNvbnNpc3RlbnRseSBkZW55IHRoYXQgaW1tdXRhYmxlIEFycmF5QnVmZmVycyBleGlzdC4qL1xuY29uc3QgYWRhcHRJbW11dGFibGVBcnJheUJ1ZmZlciA9ICgpID0+IHtcbiAgY29uc3QgYW5BcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcblxuICAvKiBPbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzbGljZVRvSW1tdXRhYmxlLCBwYXNzLXN0eWxlIGJ5dGVBcnJheSovXG4gIC8qIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4qL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFRPRE8gVGhpcyBlcnJvciB3aWxsIGJlIGFkZHJlc3NlZCB3aGVuIHVwZGF0aW5nKi9cbiAgLyogVHlwZVNjcmlwdCdzIG5hdGl2ZSB0eXBlcyB0byBhIHZlcnNpb24gcmVjb2duaXppbmcgdGhlIHVwY29taW5nIHN0YW5kYXJkLiovXG4gIGlmIChhbkFycmF5QnVmZmVyLnNsaWNlVG9JbW11dGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZTogbnVsbCxcbiAgICAgIGltbXV0YWJsZUdldHRlcjogKCkgPT4gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBUaGlzIGVycm9yIHdpbGwgYmUgYWRkcmVzc2VkIHdoZW4gdXBkYXRpbmcqL1xuICAvKiBUeXBlU2NyaXB0J3MgbmF0aXZlIHR5cGVzIHRvIGEgdmVyc2lvbiByZWNvZ25pemluZyB0aGUgdXBjb21pbmcgc3RhbmRhcmQuKi9cbiAgY29uc3QgYW5JbW11dGFibGVBcnJheUJ1ZmZlciA9IGFuQXJyYXlCdWZmZXIuc2xpY2VUb0ltbXV0YWJsZSgpO1xuXG4gIC8qKlxuICogQXMgcHJvcG9zZWQsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBgQXJyYXlCdWZmZXIucHJvdG90eXBlYC4gQXMgc2hpbW1lZCxcbiAqIHRoaXMgd2lsbCBiZSBhIGhpZGRlbiBpbnRyaW5zaWMgdGhhdCBpbmhlcml0cyBmcm9tIGBBcnJheUJ1ZmZlci5wcm90b3R5cGVgLlxuICogRWl0aGVyIHdheSwgZ2V0IHRoaXMgaW4gYSB3YXkgdGhhdCB3ZSBjYW4gdHJ1c3QgaXQgYWZ0ZXIgbG9ja2Rvd24sIGFuZFxuICogcmVxdWlyZSB0aGF0IGFsbCBpbW11dGFibGUgQXJyYXlCdWZmZXJzIGRpcmVjdGx5IGluaGVyaXQgZnJvbSBpdC5cbiAqL1xuICBjb25zdCBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFuSW1tdXRhYmxlQXJyYXlCdWZmZXIpO1xuXG4gIGNvbnN0IGltbXV0YWJsZUdldHRlciA9IC8qKiBAdHlwZSB7KHRoaXM6IEFycmF5QnVmZmVyKSA9PiBib29sZWFufSAqLyAoXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IHRoZSBkZXNjaXB0b3IgaXMgdGhlcmUuKi9cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsICdpbW11dGFibGUnKS5nZXRcbiAgKTtcblxuICByZXR1cm4geyBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgaW1tdXRhYmxlR2V0dGVyIH07XG59O1xuXG5jb25zdCB7IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCBpbW11dGFibGVHZXR0ZXIgfSA9XG4gIGFkYXB0SW1tdXRhYmxlQXJyYXlCdWZmZXIoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgQnl0ZUFycmF5SGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnYnl0ZUFycmF5JyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICAoY2FuZGlkYXRlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgJiZcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBIb3cgZG8gSSBhZGQgaXQgdG8gdGhlIEFycmF5QnVmZmVyIHR5cGU/Ki9cbiAgICAgIGNhbmRpZGF0ZS5pbW11dGFibGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgSW1tdXRhYmxlIEFycmF5QnVmZmVyIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBfcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYE1hbGZvcm1lZCBCeXRlQXJyYXkgJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgICBhcHBseShpbW11dGFibGVHZXR0ZXIsIGNhbmRpZGF0ZSwgW10pIHx8XG4gICAgICBGYWlsYE11c3QgYmUgYW4gaW1tdXRhYmxlIEFycmF5QnVmZmVyOiAke2NhbmRpZGF0ZX1gO1xuICAgIG93bktleXMoY2FuZGlkYXRlKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICBYYEJ5dGVBcnJheXMgbXVzdCBub3QgaGF2ZSBvd24gcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCxcbiAgICAgICAgVHlwZUVycm9yLFxuICAgICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5CeXRlQXJyYXlIZWxwZXIoQnl0ZUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ5dGVBcnJheUhlbHBlciI6WyJCeXRlQXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmae90ggIAAAICAAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5LCBwcm90b3R5cGU6IGFycmF5UHJvdG90eXBlIH0gPSBBcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IENvcHlBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBhcnJheVByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4gICAgLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgZ2V0IHRvIGZhaWwuKi9cbiAgICBjb25zdCBsZW4gPSAvKiogQHR5cGUge251bWJlcn0gKi8gKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAnbGVuZ3RoJywgZmFsc2UsIGFzc2VydENoZWNrZXIpLnZhbHVlXG4gICAgKTtcbiAgICAvKiBWYWxpZGF0ZSB0aGF0IGVhY2ggaW5kZXggcHJvcGVydHkgaXMgb3duL2RhdGEvZW51bWVyYWJsZSovXG4gICAgLyogYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGlzIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlLiovXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCBpLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIEV4cGVjdCBvbmUga2V5IHBlciBpbmRleCBwbHVzIG9uZSBmb3IgJ2xlbmd0aCcuKi9cbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSBsZW4gKyAxIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICB9LFxufSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHL7odZwsAAGcLAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3IsQ1gsY2FuQmVNZXRob2Q7JGjNj19pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja09iamVjdFByb3RvdHlwZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBrZXlcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja1Byb3BlcnR5Q2FuQmVWYWxpZCA9IChjYW5kaWRhdGUsIGtleSwgdmFsdWUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICghY2FuQmVNZXRob2QodmFsdWUpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICAvKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSlcbiAgKTtcbn07XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBDb3B5UmVjb3JkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnY29weVJlY29yZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2tPYmplY3RQcm90b3R5cGUoY2FuZGlkYXRlLCBjaGVjaykgJiZcbiAgICAgIC8qIFJlamVjdCBhbnkgY2FuZGlkYXRlIHdpdGggYSBzeW1ib2wta2V5ZWQgcHJvcGVydHkgb3IgbWV0aG9kLWxpa2UgcHJvcGVydHkqL1xuICAgICAgLyogKHN1Y2ggaW5wdXQgaXMgcG90ZW50aWFsbHkgYSBSZW1vdGFibGUpLiovXG4gICAgICBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoa2V5ID0+XG4gICAgICAgIGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSwga2V5LCBjYW5kaWRhdGVba2V5XSwgY2hlY2spLFxuICAgICAgKVxuICAgICk7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgLyogVmFsaWRhdGUgdGhhdCBlYWNoIG93biBwcm9wZXJ0eSBoYXMgYSByZWN1cnNpdmVseSBwYXNzYWJsZSBhc3NvY2lhdGVkKi9cbiAgICAvKiB2YWx1ZSAod2UgYWxyZWFkeSBrbm93IGZyb20gY2FuQmVWYWxpZCB0aGF0IHRoZSBvdGhlciBjb25zdHJhaW50cyBhcmUqL1xuICAgIC8qIHNhdGlzZmllZCkuKi9cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBnZXRPd25EYXRhRGVzY3JpcHRvcihcbiAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cnVlLFxuICAgICAgICBhc3NlcnRDaGVja2VyLFxuICAgICAgKTtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpO1xuICAgIH1cbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ46wtPYGQAA2BkAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkLGlzQXRvbTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiaXNBdG9tXCIsWyRozY9fYSA9PiAoaXNBdG9tID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVCcmFuZH0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgQnl0ZUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5QXJyYXksIENvcHlUYWdnZWQsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgW0tleVR5cGUgaW4ga2V5b2YgVF06IFRbS2V5VHlwZV0gfSAmIHt9fSBTaW1wbGlmeSBmbGF0dGVuIHRoZVxuICogICB0eXBlIG91dHB1dCB0byBpbXByb3ZlIHR5cGUgaGludHMgc2hvd24gaW4gZWRpdG9yc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlID8gVFtLXSA6IERlZXBseUF3YWl0ZWQ8VFtLXT47XG4gKiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT5cbiAqICAgICA/IEF3YWl0ZWQ8VD5cbiAqICAgICA6IFQgZXh0ZW5kcyAoUmVtb3RhYmxlQnJhbmQ8YW55LCBhbnk+IHwgUmVtb3RhYmxlT2JqZWN0KVxuICogICAgICAgPyBUXG4gKiAgICAgICA6IFQgZXh0ZW5kcyB7fVxuICogICAgICAgICA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+XG4gKiAgICAgICAgIDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpblxuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwiQGVuZG8vcGF0dGVybnNcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsXG4gKiBiZWNhdXNlIGl0IGRlZmluZXMgdGhlIGBLZXlgIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVD1QYXNzYWJsZV1cbiAqIEBwYXJhbSB7VH0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZCA9IGFzeW5jIHZhbCA9PiB7XG4gIC8qIFRPRE8gRmlndXJlIG91dCB3aHkgd2UgbmVlZCB0aGVzZSBhdC1leHBlY3QtZXJyb3IgZGlyZWN0aXZlcyBiZWxvdyovXG4gIC8qIGFuZCBmaXggaWYgcG9zc2libGUuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xMjU3IG1heSBiZSByZWxldmFudC4qL1xuXG4gIC8qIElmIGB2YWxgIGlzIG5vdCBQYXNzYWJsZSwgYGlzQXRvbWAgd2lsbCByZXR1cm4gZmFsc2UgcmF0aGVyIHRoYW4qL1xuICAvKiB0aHJvd2luZy4qL1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtEZWVwbHlBd2FpdGVkPFQ+fSAqLyAodmFsKTtcbiAgfVxuICAvKiBpZiBgdmFsYCBpcyBhIHByb21pc2UgYnV0IG5vdCBhIHBhc3NhYmxlIHByb21pc2UsIGZvciBleGFtcGxlLCovXG4gIC8qIGJlY2F1c2UgaXQgaXMgbm90IGhhcmRlbmVkLCBgaXNQcm9taXNlYCB3aWxsIHJldHVybiB0cnVlLCB3aGljaCBpcyovXG4gIC8qIG9rIGhlcmUgYmFjYXVzZSB3ZSB1bndyYXAgaXQgdG8gaXRzIHNldHRsZW1lbnQgYW5kIGRpc3BlbnNlIHdpdGggdGhlKi9cbiAgLyogcHJvbWlzZSovXG4gIGlmIChpc1Byb21pc2UodmFsKSkge1xuICAgIHJldHVybiBFLndoZW4odmFsLCBub25wID0+IGRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gIH1cbiAgLyogSWYgYHZhbGAgaXMgYW55IG90aGVyIG5vbi1QYXNzYWJsZSwgdGhlIGBwYXNzU3R5bGVPZih2YWwpYCB3aWxsIHRocm93LiovXG4gIC8qIFNvIHRoaXMgZXhlbXB0aW9uIGZvciBub24tUGFzc2FibGUgcHJvbWlzZXMgaXMgb25seSBmb3IgdGhlIHRvcC1sZXZlbC4qL1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICBjb25zdCByZWMgPSAvKiogQHR5cGUge0NvcHlSZWNvcmR9ICovICh2YWwpO1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyZWMpKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gbmFtZXMubWFwKG5hbWUgPT4gZGVlcGx5RnVsZmlsbGVkKHJlY1tuYW1lXSkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PlxuICAgICAgICBoYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsIGkpID0+IFtuYW1lc1tpXSwgY10pKSksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICBjb25zdCBhcnIgPSAvKiogQHR5cGUge0NvcHlBcnJheX0gKi8gKHZhbCk7XG4gICAgICBjb25zdCB2YWxQcyA9IGFyci5tYXAocCA9PiBkZWVwbHlGdWxmaWxsZWQocCkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PiBoYXJkZW4odmFscykpO1xuICAgIH1cbiAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICBjb25zdCBieXRlQXJyYXkgPSAvKiogQHR5cGUge0J5dGVBcnJheX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHZhbCkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gYnl0ZUFycmF5O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiogQHR5cGUge0NvcHlUYWdnZWR9ICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHRnZC5wYXlsb2FkKSwgcGF5bG9hZCA9PlxuICAgICAgICBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBjb25zdCByZW0gPSAvKiogQHR5cGUge1JlbW90YWJsZU9iamVjdH0gKi8gKHZhbCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiByZW07XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgY29uc3QgZXJyID0gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHZhbCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyoqIEB0eXBlIHtQcm9taXNlfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAassmRs0dAADNHQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NoZWNrZXIsIFBhc3NTdHlsZSwgUGFzc1N0eWxlT2Z9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLyogQ2FzdCBiZWNhdXNlIG90aGVyd2lzZSBUUyBpcyBjb25mdXNlZCBieSBBZ2dyZWdhdGVFcnJvciovXG4gIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDQyI2Rpc2N1c3Npb25fcjE0ODQ5MzMwMjgqL1xuICAvKiogQHR5cGUge0FycmF5PFtzdHJpbmcsIElNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3JdPn0gKi9cbiAgKFtcbiAgICBbJ0Vycm9yJywgRXJyb3JdLFxuICAgIFsnRXZhbEVycm9yJywgRXZhbEVycm9yXSxcbiAgICBbJ1JhbmdlRXJyb3InLCBSYW5nZUVycm9yXSxcbiAgICBbJ1JlZmVyZW5jZUVycm9yJywgUmVmZXJlbmNlRXJyb3JdLFxuICAgIFsnU3ludGF4RXJyb3InLCBTeW50YXhFcnJvcl0sXG4gICAgWydUeXBlRXJyb3InLCBUeXBlRXJyb3JdLFxuICAgIFsnVVJJRXJyb3InLCBVUklFcnJvcl1cblxuICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvNTUwKi9cbiAgICAvKiBUbyBhY2NvbW1vZGF0ZSBwbGF0Zm9ybXMgcHJpb3IgdG8gQWdncmVnYXRlRXJyb3IsIHdlIGNvbW1lbnQgb3V0IHRoZSovXG4gICAgLyogZm9sbG93aW5nIGxpbmUgYW5kIGluc3RlYWQgY29uZGl0aW9uYWxseSBhZGQgaXQgdG8gdGhlIG1hcCBiZWxvdy4qL1xuICAgIC8qIFsnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcl0sKi9cbiAgXSksXG4pO1xuXG5pZiAodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAvKiBDb25kaXRpb25hbCwgdG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yKi9cbiAgZXJyb3JDb25zdHJ1Y3RvcnMuc2V0KCdBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yKTtcbn1cblxuLyoqXG4gKiBCZWNhdXNlIHRoZSBlcnJvciBjb25zdHJ1Y3RvciByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlXG4gKiBgQWdncmVnYXRlRXJyb3JgLCB3aGljaCBoYXMgZGlmZmVyZW50IGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzXG4gKiBmcm9tIHRoZSBvdGhlciBlcnJvciBjb25zdHJ1Y3RvcnMsIGRvIG5vdCB1c2UgaXQgZGlyZWN0bHkgdG8gdHJ5XG4gKiB0byBtYWtlIGFuIGVycm9yIGluc3RhbmNlLiBSYXRoZXIsIHVzZSBgbWFrZUVycm9yYCB3aGljaCBlbmNhcHN1bGF0ZXNcbiAqIHRoaXMgbm9uLXVuaWZvcm1pdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkfVxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xuICByZXR1cm4gKFxuICAgIGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKVxuICApO1xufTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBpc0Vycm9yTGlrZSA9IGNhbmRpZGF0ZSA9PiBjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRozY9fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wTmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChcbiAgcHJvcE5hbWUsXG4gIGRlc2MsXG4gIHBhc3NTdHlsZU9mUmVjdXIsXG4gIGNoZWNrID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmIChkZXNjLmVudW1lcmFibGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGlmICghaGFzT3duKGRlc2MsICd2YWx1ZScpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBkYXRhIHByb3BlcnR5OiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgeyB2YWx1ZSB9ID0gZGVzYztcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgIGNhc2UgJ3N0YWNrJzoge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt2YWx1ZX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY2F1c2UnOiB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKHZhbHVlLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayk7XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9ycyc6IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSkgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGNvcHlBcnJheTogJHt2YWx1ZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUuZXZlcnkoZXJyID0+XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiAoXG4gICAgISFjaGVjayAmJlxuICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydHkgJHtxKHByb3BOYW1lKX1gXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAewaKenwJAAB8CQAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbiAgICAgICBjb25zdCBtYXBJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIGZ1bmMpID0+XG4gIC8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG4gIEZhcignbWFwcGVkIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgcmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZTogYmFzZVZhbHVlLCBkb25lIH0gPSBiYXNlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZG9uZSA/IGJhc2VWYWx1ZSA6IGZ1bmMoYmFzZVZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIGRvbmUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTskaM2PX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGZpbHRlckl0ZXJhYmxlID0gKGJhc2VJdGVyYWJsZSwgcHJlZCkgPT5cbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbiAgRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChkb25lIHx8IHByZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChJ4zJ9CUAAPQlAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJHRVRfTUVUSE9EX05BTUVTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldE1ldGhvZE5hbWVzLHEsRmFpbCxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLFskaM2PX2EgPT4gKGFzc2VydElmYWNlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtSZW1vdGFibGVCcmFuZH0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCcgKi9cbi8qKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgcHJvdG90eXBlOiBmdW5jdGlvblByb3RvdHlwZSB9ID0gRnVuY3Rpb247XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBzZXRQcm90b3R5cGVPZixcbiAgY3JlYXRlLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90byA9IChyZW1vdGFibGUsIGlmYWNlKSA9PiB7XG4gIGxldCBvbGRQcm90byA9IGdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG4gIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChvbGRQcm90byA9PT0gbnVsbCkge1xuICAgICAgb2xkUHJvdG8gPSBvYmplY3RQcm90b3R5cGU7XG4gICAgfVxuICAgIG9sZFByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9sZFByb3RvICE9PSBudWxsIHx8XG4gICAgICBGYWlsYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xuICAgIG9sZFByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgRmFpbGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2Uge1xuICAgIEZhaWxgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuICB9XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9sZFByb3RvLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICdyZW1vdGFibGUnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICB9KSxcbiAgKTtcbn07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlID0gY2FuZGlkYXRlID0+XG4gIFJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdGVtcGxhdGUge0ludGVyZmFjZVNwZWN9IElcbiAqIEBwYXJhbSB7SX0gW2lmYWNlXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmVcbiAqIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIG9yIFwiRGVidWdOYW1lXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldFxuICogb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wc10gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVPYmplY3Q8ST4gJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbiAgICAgICBjb25zdCBSZW1vdGFibGUgPSAoXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSSBjb3VsZCBoYXZlIGRpZmZlcmVudCBzdWJ0eXBlIHRoYW4gc3RyaW5nKi9cbiAgaWZhY2UgPSAnUmVtb3RhYmxlJyxcbiAgcHJvcHMgPSB1bmRlZmluZWQsXG4gIHJlbW90YWJsZSA9IC8qKiBAdHlwZSB7VH0gKi8gKHt9KSxcbikgPT4ge1xuICBhc3NlcnRJZmFjZShpZmFjZSk7XG4gIGFzc2VydChpZmFjZSk7XG4gIC8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4gIC8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xuICBwcm9wcyA9PT0gdW5kZWZpbmVkIHx8IEZhaWxgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4gIC8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbiAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuICAvKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLyogYGlzRnJvemVuYCBhbHdheXMgcmV0dXJucyB0cnVlIHdpdGggYSBmYWtlIGBoYXJkZW5gLCBidXQgd2Ugd2FudCB0aGF0IGNhc2UqL1xuICAvKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4gIC8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4gIC8qIGhhdmUgY2F1Z2h0LiovXG4gIC8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG4gIGhhcmRlbi5pc0Zha2UgfHxcbiAgICAvKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4gIC8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4gIC8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8qIENPTU1JVFRFRCEqL1xuICAvKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuICBhc3NlcnQoaWZhY2UgIT09IHVuZGVmaW5lZCk7IC8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG4gIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKHJlbW90YWJsZSk7XG59OyRozY9fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yIG9idGFpbmluZyBhXG4gKiBsaXN0IG9mIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLCBvciBhbiBvYmplY3QgdGhhdFxuICogaW5oZXJpdHMgZnJvbSBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYC5cbiAqXG4gKiBNb2RlbGVkIG9uIGBHRVRfSU5URVJGQUNFX0dVQVJEYCBmcm9tIGBAZW5kby9leG9gLlxuICpcbiAqIFRPRE8gTmFtZSB0byBiZSBiaWtlc2hlZC4gUGVyaGFwcyBldmVuIHdoZXRoZXIgaXQgaXMgYVxuICogc3RyaW5nIG9yIHN5bWJvbCB0byBiZSBiaWtlc2hlZC4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBIQVpBUkQ6IEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qKlxuICogTm90ZSB0aGF0IGBnZXRNZXRob2ROYW1lc01ldGhvZGAgaXMgYSB0aGlzZnVsIG1ldGhvZCEgSXQgbXVzdCBiZSBzbyB0aGF0XG4gKiBpdCB3b3JrcyBhcyBleHBlY3RlZCB3aXRoIGZhci1vYmplY3QgaW5oZXJpdGFuY2UuXG4gKlxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovJGjNj19vbmNlLkdFVF9NRVRIT0RfTkFNRVMoR0VUX01FVEhPRF9OQU1FUyk7XG5jb25zdCBnZXRNZXRob2ROYW1lc01ldGhvZCA9IGhhcmRlbih7XG4gIFtHRVRfTUVUSE9EX05BTUVTXSgpIHtcbiAgICByZXR1cm4gZ2V0TWV0aG9kTmFtZXModGhpcyk7XG4gIH0sXG59KVtHRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yID0gaGFyZGVuKHtcbiAgdmFsdWU6IGdldE1ldGhvZE5hbWVzTWV0aG9kLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IGZhbHNlLFxufSk7XG5cbi8qKlxuICogTWFyayBhbiBvYmplY3QgdG8gYmUgZXhwb3NlZCBmb3IgcmVtb3RlIGludGVyYWN0aW9uXG4gKiBhbmQgZ2l2ZSBpdCBhIHN1Z2dlc3RpdmUgaW50ZXJmYWNlIG5hbWUgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiBBbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGhhdmUgdG8gYmUgbWV0aG9kcywgbm90IGRhdGEuXG4gKlxuICogVGhlIG9iamVjdCBtdXN0IG5vdCBiZSBoYXJkZW5lZCBiZWZvcmUgaXQgaXMgbWFya2VkLlxuICogSXQgd2lsbCBiZSBoYXJkZW5lZCBhZnRlciBtYXJraW5nLlxuICpcbiAqIEZvciBmYXIgb2JqZWN0cyAoYXMgb3Bwb3NlZCB0byBmYXIgZnVuY3Rpb25zKSwgYWxzbyBhZGRzXG4gKiBgX19nZXRNZXRob2ROYW1lc19fYCBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWV0aG9kIG5hbWVzLFxuICogaWYgdGhlcmUgaXMgbm90IHlldCBhbnkgbWV0aG9kIG5hbWVkIGBfX2dldE1ldGhvZE5hbWVzX19gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBGYXIoJ0VtcGxveWVlJywgeyBnZXRNYW5hZ2VyIH0pXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHRvIGJlIG1hcmtlZCBhcyByZW1vdGFibGVcbiAqL1xuICAgICAgIGNvbnN0IEZhciA9IChmYXJOYW1lLCByZW1vdGFibGUgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgciA9IHJlbW90YWJsZSA9PT0gdW5kZWZpbmVkID8gLyoqIEB0eXBlIHtUfSAqLyAoe30pIDogcmVtb3RhYmxlO1xuICBpZiAodHlwZW9mIHIgPT09ICdvYmplY3QnICYmICEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSkge1xuICAgIC8qIFRoaXMgdGVzdCBleGNsdWRlcyBmYXIgZnVuY3Rpb25zLCBzaW5jZSB3ZSBjdXJyZW50bHkgY29uc2lkZXIgdGhlbSovXG4gICAgLyogdG8gb25seSBoYXZlIGEgY2FsbC1iZWhhdmlvciwgd2l0aCBubyBjYWxsYWJsZSBtZXRob2RzLiovXG4gICAgLyogQmV3YXJlOiBNdXRhdGVzIHRoZSBpbnB1dCBhcmd1bWVudCEgQnV0IGBSZW1vdGFibGVgKi9cbiAgICAvKiAqIHJlcXVpcmVzIHRoZSBvYmplY3QgdG8gYmUgbXV0YWJsZSovXG4gICAgLyogKiBkb2VzIGZ1cnRoZXIgbXV0YXRpb25zLCovXG4gICAgLyogKiBoYXJkZW5zIHRoZSBtdXRhdGVkIG9iamVjdCBiZWZvcmUgcmV0dXJuaW5nIGl0LiovXG4gICAgLyogc28gdGhpcyBtdXRhdGlvbiBpcyBub3QgdW5wcmVjZWRlbnRlZC4gQnV0IGl0IGlzIHN1cnByaXNpbmchKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Rn0gZnVuY1xuICogQHJldHVybnMge0YgJiBSZW1vdGFibGVPYmplY3QgJiBSZW1vdGFibGVCcmFuZDx7fSwgRj59XG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNoZWNrZWQgY2FzdCovXG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJxSYGmDBQAAgwUAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLENvcHlUYWdnZWR9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFRcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFBcbiAqIEBwYXJhbSB7VH0gdGFnXG4gKiBAcGFyYW0ge1B9IHBheWxvYWRcbiAqIEByZXR1cm5zIHtDb3B5VGFnZ2VkPFQsUD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlVGFnZ2VkID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbiAgYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBjcmVhdGUob2JqZWN0UHJvdG90eXBlLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICd0YWdnZWQnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogdGFnIH0sXG4gICAgICBwYXlsb2FkOiB7IHZhbHVlOiBwYXlsb2FkLCBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgfSksXG4gICk7XG59OyRozY9fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHwl6v3qIQAA6iEAADAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiQ1giLCJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0T3duRGF0YURlc2NyaXB0b3IiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1ByaW1pdGl2ZSIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBQYXNzU3R5bGUsIEpTUHJpbWl0aXZlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRQcm90b3R5cGVPZixcbiAgaGFzT3duLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICB0eXBlZEFycmF5UHJvdG90eXBlLFxuICB0b1N0cmluZ1RhZ1N5bWJvbCxcbik7XG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPSB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID09PSAnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYE9iamVjdC5oYXNPd25gIGluc3RlYWRcbiAqL1xuICAgICAgIGNvbnN0IGhhc093blByb3BlcnR5T2YgPSBoYXNPd247XG5cbi8qKlxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyBKU1ByaW1pdGl2ZX1cbiAqLyRozY9fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuICAgICAgIGNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gIC8qIFNhZmVyIHdvdWxkIGJlIGBPYmplY3QodmFsKSAhPT0gdmFsYCBidXQgaXMgdG9vIGV4cGVuc2l2ZSBvbiBYUy4qL1xuICAvKiBTbyBpbnN0ZWFkIHdlIHVzZSB0aGlzIGFkaG9jIHNldCBvZiB0eXBlIHRlc3RzLiBCdXQgdGhpcyBpcyBub3Qgc2FmZSBpbiovXG4gIC8qIHRoZSBmYWNlIG9mIHBvc3NpYmxlIGV2b2x1dGlvbiBvZiB0aGUgbGFuZ3VhZ2UuIEJld2FyZSEqL1xuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTskaM2PX29uY2UuaXNQcmltaXRpdmUoaXNQcmltaXRpdmUpO1xuaGFyZGVuKGlzUHJpbWl0aXZlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgYCFpc1ByaW1pdGl2ZWAgaW5zdGVhZFxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyAoRnVuY3Rpb24gfCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPil9XG4gKi9cbiAgICAgICBjb25zdCBpc09iamVjdCA9IHZhbCA9PlxuICAvKiBTYWZlciB3b3VsZCBiZSBgT2JqZWN0KHZhbCkgLT09IHZhbGAgYnV0IGlzIHRvbyBleHBlbnNpdmUgb24gWFMuKi9cbiAgLyogU28gaW5zdGVhZCB3ZSB1c2UgdGhpcyBhZGhvYyBzZXQgb2YgdHlwZSB0ZXN0cy4gQnV0IHRoaXMgaXMgbm90IHNhZmUgaW4qL1xuICAvKiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBldm9sdXRpb24gb2YgdGhlIGxhbmd1YWdlLiBCZXdhcmUhKi9cbiAgISF2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpOyRozY9fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG4gICAgICAgY29uc3QgaXNUeXBlZEFycmF5ID0gb2JqZWN0ID0+IHtcbiAgLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbiAgY29uc3QgdGFnID0gYXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLCBvYmplY3QsIFtdKTtcbiAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkO1xufTskaM2PX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuLyoqXG4gKiBXZSBjYXN0IG91ciBgU3ltYm9sLmZvcigpYCB0byBhIHN0cmluZyBjb25zdGFudCBoZXJlIHRvIGF2b2lkIGV4cG9zaW5nIHRoZVxuICogYHVuaXF1ZSBzeW1ib2xgIHR5cGUgcHVibGljbHkuICBUaGUgY2FzdCBkb2Vzbid0IGNoYW5nZSBhbnkgcnVudGltZVxuICogYmVoYXZpb3IuLi4gaXQncyBzdGlsbCBhY3R1YWxseSBhIHN5bWJvbC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgd29ya2Fyb3VuZCwgd2UndmUgb2JzZXJ2ZWQgZXJyb3JzIHdoZW4gdXNpbmdcbiAqIGB0eXBlc2NyaXB0QDUuOS4zYCdzIGB0c2NgIHRvIGdlbmVyYXRlIGRlY2xhcmF0aW9uIGZpbGVzICguZC50cykgZm9yXG4gKiBjb25zdW1lcnMgb2YgbW9kdWxlcyB0aGF0IGltcG9ydCBgUEFTU19TVFlMRWA6XG4gKiBAZXhhbXBsZVxuICogICBlcnJvciBUUzkwMDY6IERlY2xhcmF0aW9uIGVtaXQgZm9yIHRoaXMgZmlsZSByZXF1aXJlcyB1c2luZyBwcml2YXRlIG5hbWVcbiAqICAgJ1BBU1NfU1RZTEUnIGZyb20gbW9kdWxlICcuLi4vQGVuZG8vcGFzcy1zdHlsZS9zcmMvdHlwZXNcIicuIEFuIGV4cGxpY2l0XG4gKiAgIHR5cGUgYW5ub3RhdGlvbiBtYXkgdW5ibG9jayBkZWNsYXJhdGlvbiBlbWl0LlxuICovXG4gICAgICAgY29uc3QgUEFTU19TVFlMRSA9IC8qKiBAdHlwZSB7J1N5bWJvbChwYXNzU3R5bGUpJ30gKi8gKFxuICAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wuZm9yKCdwYXNzU3R5bGUnKSlcbik7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi8kaM2PX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbiAgICAgICBjb25zdCBhc3NlcnRDaGVja2VyID0gKGNvbmQsIGRldGFpbHMpID0+IHtcbiAgYXNzZXJ0KGNvbmQsIGRldGFpbHMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogUmV0dXJucyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRvIGZhaWwgdGhlIHByb3ZpZGVkIENoZWNrZXIgd2l0aCBkZXRhaWxzLlxuICogVGhlIG5hbWUgbXVzdCBiZSBzaG9ydCBmb3IgZXJnb25vbWljIGlubGluZSB1c2UgYXMgaW46XG4gKiBgYGBcbiAqIHJldHVybiBjaGVja0NvbmRpdGlvbiguLi4pIHx8ICghIWNoZWNrICYmIENYKGNoZWNrKWAuLi5gKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgICAgIGNvbnN0IENYID0gY2hlY2sgPT4ge1xuICBjb25zdCByZWplY3QgPSAoVCwgLi4uc3VicykgPT4gY2hlY2soZmFsc2UsIFgoVCwgLi4uc3VicykpO1xuICByZXR1cm4gcmVqZWN0O1xufTskaM2PX29uY2UuQ1goQ1gpO1xuaGFyZGVuKENYKTtcblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHlcbiAqIGFuZCByZXR1cm5zIGl0cyBkZXNjcmlwdG9yLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfVxuICovXG4gICAgICAgY29uc3QgZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcHJvcE5hbWUsXG4gIHNob3VsZEJlRW51bWVyYWJsZSxcbiAgY2hlY2ssXG4pID0+IHtcbiAgY29uc3QgZGVzYyA9IC8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqLyAoXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgcHJvcE5hbWUpXG4gICk7XG4gIHJldHVybiAoZGVzYyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYCR7cShwcm9wTmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoaGFzT3duKGRlc2MsICd2YWx1ZScpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKHNob3VsZEJlRW51bWVyYWJsZVxuICAgICAgPyBkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKVxuICAgICAgOiAhZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKVxuICAgID8gZGVzY1xuICAgIDogLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh1bmRlZmluZWQpKTtcbn07JGjNj19vbmNlLmdldE93bkRhdGFEZXNjcmlwdG9yKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcbmhhcmRlbihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBUXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZWQ8YW55LCBUPn0gdGFnUmVjb3JkXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IGdldFRhZyA9IHRhZ1JlY29yZCA9PiB0YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaM2PX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuICAgICAgIGNvbnN0IGNoZWNrUGFzc1N0eWxlID0gKG9iaiwgcGFzc1N0eWxlLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICBwYXNzU3R5bGUgPT09IGV4cGVjdGVkUGFzc1N0eWxlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZCA9IGNoZWNrUHJvdG8gPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlZDxhbnksIGFueT59IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IGV4cGVjdGVkUGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gKHRhZ1JlY29yZCwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghaXNQcmltaXRpdmUodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNQcmltaXRpdmUiOlsiaXNQcmltaXRpdmUiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACYCjrdiPwAAYj8AACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2J5dGVBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3RyaW5nLmpzIl0sImV4cG9ydHMiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciIsInRvVGhyb3dhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzUHJpbWl0aXZlLGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLGFzc2VydENoZWNrZXIsQ29weUFycmF5SGVscGVyLEJ5dGVBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vYnl0ZUFycmF5LmpzXCIsIFtbXCJCeXRlQXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChCeXRlQXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIixbJGjNj19hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIixbJGjNj19hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgQ29weVRhZ2dlZCwgUGFzc2FibGV9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZU9mfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj59IEhlbHBlcnNSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtIZWxwZXJzUmVjb3JkfVxuICovXG5jb25zdCBtYWtlSGVscGVyVGFibGUgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGNvcHlBcnJheTogdW5kZWZpbmVkLFxuICAgIGJ5dGVBcnJheTogdW5kZWZpbmVkLFxuICAgIGNvcHlSZWNvcmQ6IHVuZGVmaW5lZCxcbiAgICB0YWdnZWQ6IHVuZGVmaW5lZCxcbiAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgIHJlbW90YWJsZTogdW5kZWZpbmVkLFxuICB9O1xuICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgY29uc3QgeyBzdHlsZU5hbWUgfSA9IGhlbHBlcjtcbiAgICBzdHlsZU5hbWUgaW4gSGVscGVyVGFibGUgfHwgRmFpbGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPSBoZWxwZXI7XG4gIH1cbiAgZm9yIChjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpIHtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtIZWxwZXJzUmVjb3JkfSAqLyAoXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoaGFyZGVuKEhlbHBlclRhYmxlKSlcbiAgKTtcbn07XG5cbi8qKlxuICogVGhlIGBhc3NlcnRSZXN0VmFsaWRgIGFzc3VtZXMgdGhhdCB0aGUgYGNhbkJlVmFsaWRgIGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAqIENvbnRleHRzIHdoZXJlIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCBzaG91bGQgY2FsbCBgYXNzZXJ0VmFsaWRgIGluc3RlYWQsXG4gKiB3aGljaCBjaGVja3MgYm90aCBjb25kaXRpb25zIGluIHRoZSByaWdodCBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcn0gaGVscGVyXG4gKiBAcGFyYW0ge2FueX0gY2FuZGlkYXRlXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0VmFsaWQgPSAoaGVscGVyLCBjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgaGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcbiAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0gbWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuICBjb25zdCByZW1vdGFibGVIZWxwZXIgPSBIZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbiAgLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFdlYWtLZXksIFBhc3NTdHlsZT59XG4gKi9cbiAgY29uc3QgcGFzc1N0eWxlTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgY29uc3QgcGFzc1N0eWxlT2YgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4gICAgLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4gICAgLyogdHJhZGVvZmZzLiovXG4gICAgY29uc3QgaW5Qcm9ncmVzcyA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mUmVjdXIgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCBpbm5lcklzT2JqZWN0ID0gIWlzUHJpbWl0aXZlKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbiAgICAgICAgICAgICAgLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuICAgICAgICAgICAgICBpc1R5cGVkQXJyYXkoaW5uZXIpXG4gICAgICAgICAgICAgICAgPyBYYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYFxuICAgICAgICAgICAgICAgIDogWGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1Byb21pc2UoaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG4gICAgICAgICAgICByZXR1cm4gJ3Byb21pc2UnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGNvbnN0IHBhc3NTdHlsZVRhZyA9IGlubmVyW1BBU1NfU1RZTEVdO1xuICAgICAgICAgIGlmIChwYXNzU3R5bGVUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsICdzdHJpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBlciA9IEhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG4gICAgICAgICAgICBoZWxwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZChoZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICAgIHJldHVybiAvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi8gKHBhc3NTdHlsZVRhZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICAgICAgICAgIGlmIChoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpIHtcbiAgICAgICAgICAgICAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICAgIHJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnRWYWxpZChyZW1vdGFibGVIZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOiB7XG4gICAgICAgICAgaXNGcm96ZW4oaW5uZXIpIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xuICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsIFR5cGVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbn07XG5cbiAgICAgICBjb25zdCBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCA9IFN5bWJvbC5mb3IoJ0BlbmRvIHBhc3NTdHlsZU9mJyk7XG5cbi8qKlxuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIHByb3BlcnR5IG9uIHRoZSBnbG9iYWwsXG4gKiB0aGVuIHByZXN1bWFibHkgaXQgd2FzIGVuZG93ZWQgZm9yIHVzIGJ5IGxpdmVzbG90cyB3aXRoIGEgYHBhc3NTdHlsZU9mYFxuICogZnVuY3Rpb24sIHNvIHdlIHNob3VsZCB1c2UgYW5kIGV4cG9ydCB0aGF0IG9uZSBpbnN0ZWFkLlxuICogT3RoZXIgc29mdHdhcmUgbWF5IGhhdmUgbGVmdCBpdCBmb3IgdXMgaGVyZSxcbiAqIGJ1dCBpdCB3b3VsZCByZXF1aXJlIHdyaXRlIGFjY2VzcyB0byBvdXIgZ2xvYmFsLCBvciB0aGUgYWJpbGl0eSB0b1xuICogcHJvdmlkZSBlbmRvd21lbnRzIHRvIG91ciBnbG9iYWwsIGJvdGggb2Ygd2hpY2ggc2VlbXMgYWRlcXVhdGUgYXMgYSB0ZXN0IG9mXG4gKiB3aGV0aGVyIGl0IGlzIGF1dGhvcml6ZWQgdG8gc2VydmUgdGhlIHNhbWUgcm9sZSBhcyBsaXZlc2xvdHMuXG4gKlxuICogTk9URSBIQVpBUkQ6IFRoaXMgdXNlIGJ5IGxpdmVzbG90cyBkb2VzIHJlbHkgb24gYHBhc3NTdHlsZU9mYCBiZWluZ1xuICogZGV0ZXJtaW5pc3RpYy4gSWYgaXQgaXMgbm90LCB0aGVuIGluIGEgbGl2ZXNsb3QtbGlrZSB2aXJ0dWFsaXplZFxuICogZW52aXJvbm1lbnQsIGl0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCBHQy5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIEJ5dGVBcnJheUhlbHBlcixcbiAgICBDb3B5UmVjb3JkSGVscGVyLFxuICAgIFRhZ2dlZEhlbHBlcixcbiAgICBFcnJvckhlbHBlcixcbiAgICBSZW1vdGFibGVIZWxwZXIsXG4gIF0pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZSA9IHZhbCA9PiB7XG4gIHBhc3NTdHlsZU9mKHZhbCk7IC8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLyoqXG4gKiBJcyBgc3BlY2ltZW5gIFBhc3NhYmxlPyBUaGlzIHJldHVybnMgdHJ1ZSBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWBcbiAqIHJldHVybnMgYSBzdHJpbmcuIFRoaXMgcmV0dXJucyBgZmFsc2VgIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYCB0aHJvd3MuXG4gKiBVbmRlciBubyBub3JtYWwgY2lyY3Vtc3RhbmNlIHNob3VsZCBgaXNQYXNzYWJsZShzcGVjaW1lbilgIHRocm93LlxuICpcbiAqIFRPRE8gRGVwcmVjYXRlIGFuZCB1bHRpbWF0ZWx5IGRlbGV0ZSBAYWdvcmljL2Jhc2Utem9uZSdzIGBpc1Bhc3NhYmxlJyBpblxuICogZmF2b3Igb2YgdGhpcyBvbmUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yMDk2XG4gKlxuICogVE9ETyBpbXBsZW1lbnQgYW4gaXNQYXNzYWJsZSB0aGF0IGRvZXMgbm90IHJlbHkgb24gdHJ5L2NhdGNoLlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGEgc3RhbmRpbiB1bnRpbCB0aGVuLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgdHJ5IHtcbiAgICAvKiBJbiBmYWN0LCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC4gSXQgZWl0aGVyIHJldHVybnMgYSovXG4gICAgLyogc3RyaW5nIG9yIHRocm93cy4qL1xuICAgIHJldHVybiBwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbmhhcmRlbihpc1Bhc3NhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSwgZGVzYywgcGFzc1N0eWxlT2YpO1xuXG4vKipcbiAqIEFmdGVyIGhhcmRlbmluZywgaWYgYGVycmAgaXMgYSBwYXNzYWJsZSBlcnJvciwgcmV0dXJuIGl0LlxuICpcbiAqIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpY1xuICogaW5mbyBvZiB0aGUgb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBUT0RPIEFkb3B0IGEgbW9yZSBmbGV4aWJsZSBub3Rpb24gb2YgcGFzc2FibGUgZXJyb3IsIGluIHdoaWNoXG4gKiBhIHBhc3NhYmxlIGVycm9yIGNhbiBjb250YWluIG90aGVyIG93biBkYXRhIHByb3BlcnRpZXMgd2l0aFxuICogdGhyb3dhYmxlIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuICAgICAgIGNvbnN0IHRvUGFzc2FibGVFcnJvciA9IGVyciA9PiB7XG4gIGhhcmRlbihlcnIpO1xuICBpZiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZikpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyO1xuICBjb25zdCB7IGNhdXNlOiBjYXVzZURlc2MsIGVycm9yczogZXJyb3JzRGVzYyB9ID1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvKiBAdHMtaWdub3JlIEFzc3VtaW5nIGNhdXNlIGlzIEVycm9yIHwgdW5kZWZpbmVkKi9cbiAgICBjYXVzZSxcbiAgICBlcnJvcnMsXG4gIH0pO1xuICAvKiBTdGlsbCBuZWVkZWQsIGJlY2F1c2UgYG1ha2VFcnJvcmAgb25seSBkb2VzIGEgc2hhbGxvdyBmcmVlemUuKi9cbiAgaGFyZGVuKG5ld0Vycm9yKTtcbiAgLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuICAvKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuICAvKiB0byBiZSBsb2dnZWQuKi9cbiAgYW5ub3RhdGVFcnJvcihuZXdFcnJvciwgWGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbiAgcGFzc1N0eWxlT2YobmV3RXJyb3IpID09PSAnZXJyb3InIHx8XG4gICAgRmFpbGBFeHBlY3RlZCAke25ld0Vycm9yfSB0byBiZSBhIHBhc3NhYmxlIGVycm9yYDtcbiAgcmV0dXJuIG5ld0Vycm9yO1xufTskaM2PX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcblxuLyoqXG4gKiBBZnRlciBoYXJkZW5pbmcsIGlmIGBzcGVjaW1lbmAgaXMgdGhyb3dhYmxlLCByZXR1cm4gaXQuXG4gKiBBIHNwZWNpbWVuIGlzIHRocm93YWJsZSBpZmYgaXQgaXMgUGFzc2FibGUgYW5kIGNvbnRhaW5zIG5vIFBhc3NhYmxlQ2FwcyxcbiAqIGkuZS4sIG5vIFJlbW90YWJsZXMgb3IgUHJvbWlzZXMuXG4gKiBJT1csIGlmIGl0IGNvbnRhaW5zIG9ubHkgY29weS1kYXRhIGFuZCBwYXNzYWJsZSBlcnJvcnMuXG4gKlxuICogT3RoZXJ3aXNlLCBpZiBgc3BlY2ltZW5gIGlzICphbG1vc3QqIHRocm93YWJsZSwgZm9yIGV4YW1wbGUsIGl0IGlzXG4gKiBhbiBlcnJvciB0aGF0IGNhbiBiZSBtYWRlIHRocm93YWJsZSBieSBgdG9QYXNzYWJsZUVycm9yYCwgdGhlblxuICogcmV0dXJuIGBzcGVjaW1lbmAgY29udmVydGVkIHRvIGEgdGhyb3dhYmxlLlxuICpcbiAqIE90aGVyd2lzZSwgdGhyb3cgYSBkaWFnbm9zdGljIGluZGljYXRpbmcgYSBmYWlsdXJlIHRvIGNvZXJjZS5cbiAqXG4gKiBUaGlzIGlzIGluIHN1cHBvcnQgb2YgdGhlIGV4byBib3VuZGFyeSB0aHJvd2luZyBvbmx5IHRocm93YWJsZXMsIHRvIGVhc2VcbiAqIHNlY3VyaXR5IHJldmlldy5cbiAqXG4gKiBUT0RPIEFkb3B0IGEgbW9yZSBmbGV4aXRibGUgbm90aW9uIG9mIHRocm93YWJsZSwgaW4gd2hpY2hcbiAqIGRhdGEgY29udGFpbmVycyBjb250YWluaW5nIG5vbi1wYXNzYWJsZSBlcnJvcnMgY2FuIHRoZW1zZWx2ZXMgYmUgY29lcmNlZFxuICogdG8gdGhyb3dhYmxlIGJ5IGNvZXJjaW5nIHRvIGEgc2ltaWxhciBjb250YWluZXJzIGNvbnRhaW5pbmdcbiAqIHRoZSByZXN1bHRzIG9mIGNvZXJjaW5nIHRob3NlIGVycm9ycyB0byBwYXNzYWJsZSBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHJldHVybnMge1Bhc3NhYmxlPG5ldmVyLCBFcnJvcj59XG4gKi9cbiAgICAgICBjb25zdCB0b1Rocm93YWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgaGFyZGVuKHNwZWNpbWVuKTtcbiAgaWYgKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHNwZWNpbWVuKSk7XG4gIH1cbiAgaWYgKCFpc1ByaW1pdGl2ZShzcGVjaW1lbikpIHtcbiAgICAvKiBOb3RlIHRoYXQgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiBgc3BlY2ltZW5gIHdvdWxkIGJlIGEgcGFzc2FibGUgY29udGFpbmVyKi9cbiAgICAvKiBleGNlcHQgdGhhdCBpdCBjb250YWlucyBub24tcGFzc2FibGUgZXJyb3JzIHRoYXQgY291bGQgYmUgY29udmVydGVkLiovXG4gICAgLyogVGhpcyB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgdG8gZG8gdGhlIFRPRE8gYWJvdmUuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSAvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi8gKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAvKiogQHR5cGUge0NvcHlBcnJheX0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudCA9PT0gdG9UaHJvd2FibGUoZWxlbWVudCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgY29uc3QgcmVjID0gLyoqIEB0eXBlIHtDb3B5UmVjb3JkfSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMocmVjKSkge1xuICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGcgPSAvKiogQHR5cGUge0NvcHlUYWdnZWR9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGc7XG4gICAgICAgIHBheWxvYWQgPT09IHRvVGhyb3dhYmxlKHBheWxvYWQpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtwYXlsb2FkfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVyID0gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZXIgPT09IHRvVGhyb3dhYmxlKGVyKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZXJ9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzYWJsZTxuZXZlcixuZXZlcj59ICovIChzcGVjaW1lbik7XG59OyRozY9fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+5yfsjAuAAAwLgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImNhbkJlTWV0aG9kIiwiZ2V0SW50ZXJmYWNlT2YiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxnZXRNZXRob2ROYW1lcyxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc1ByaW1pdGl2ZSxnZXRUYWcsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlciwgUmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0ludGVyZmFjZVNwZWMsIFBhc3NTdHlsZWR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Z1bmMgaXMgQ2FsbGFibGVGdW5jdGlvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNhbkJlTWV0aG9kID0gZnVuYyA9PlxuICB0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJyAmJiAhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjNj19vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yODg0Ki9cbi8qIEFic3RyYWN0IG91dCBjYW5CZU1ldGhvZE5hbWUgc28gbGF0ZXIgUFJzIGFncmVlIG9uIG1ldGhvZCBuYW1lIHJlc3RyaWN0aW9ucy4qL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBrZXlcbiAqIEByZXR1cm5zIHtrZXkgaXMgUmVtb3RhYmxlTWV0aG9kTmFtZX1cbiAqL1xuY29uc3QgY2FuQmVNZXRob2ROYW1lID0ga2V5ID0+XG4gIC8qIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnOyovXG4gIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnIHx8IHR5cGVvZiBrZXkgPT09ICdudW1iZXInO1xuaGFyZGVuKGNhbkJlTWV0aG9kTmFtZSk7XG5cbi8qKlxuICogVXNlcyB0aGUgYGdldE1ldGhvZE5hbWVzYCBmcm9tIHRoZSBldmVudHVhbC1zZW5kIGxldmVsIG9mIGFic3RyYWN0aW9uIHRoYXRcbiAqIGRvZXMgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgcmVtb3RhYmxlcy5cbiAqXG4gKiBDdXJyZW50bHksIGp1c3QgYWxpYXMgYGdldE1ldGhvZE5hbWVzYCBidXQgdGhpcyBhYnN0cmFjdGlvbiBleGlzdHMgc29cbiAqIGEgZnV0dXJlIFBSIGNhbiBlbmZvcmNlIHJlc3RyaWN0aW9ucyBvbiBtZXRob2QgbmFtZXMgb2YgcmVtb3RhYmxlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHJldHVybnMge1JlbW90YWJsZU1ldGhvZE5hbWVbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzID0gYmVoYXZpb3JNZXRob2RzID0+XG4gIGdldE1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcyk7JGjNj19vbmNlLmdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRSZW1vdGFibGVNZXRob2ROYW1lcyk7XG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGhhc093bixcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4gICAgKHR5cGVvZiBpZmFjZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpICYmXG4gICAgKGlmYWNlID09PSAnUmVtb3RhYmxlJyB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJykgfHxcbiAgICAgIGlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKGNoZWNrKWBGb3Igbm93LCBpZmFjZSAke3EoXG4gICAgICAgICAgaWZhY2UsXG4gICAgICAgICl9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpXG4gICk7XG59O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRJZmFjZSA9IGlmYWNlID0+IGNoZWNrSWZhY2UoaWZhY2UsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2YgPSAob3JpZ2luYWwsIGNoZWNrKSA9PiB7XG4gICFpc1ByaW1pdGl2ZShvcmlnaW5hbCkgfHxcbiAgICBGYWlsYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4gIC8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuICAvKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4gIC8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4gIC8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuICAvKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4gIC8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuICAvKiovXG4gIC8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuICAvKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuICAvKiovXG4gIC8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4gIC8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbiAgLyogfX0qL1xuICAvKiovXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuICBpZiAoXG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgIHByb3RvID09PSBudWxsIHx8XG4gICAgcHJvdG8gPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFBBU1NfU1RZTEUpO1xuICBjb25zdCB0YWdLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICBjb25zdCB7XG4gICAgLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0YWdLZXkpXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICAuLi5yZXN0RGVzY3NcbiAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG4gIHJldHVybiAoXG4gICAgKG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpICYmXG4gICAgY2hlY2tJZmFjZShpZmFjZSwgY2hlY2spXG4gICk7XG59O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZU9iamVjdD59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXMgPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge3ZhbCBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzRnJvemVuKHZhbCkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJiBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gXG4gICAgKTtcbiAgfVxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBpZiAoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogU2ltcGxlIHNlbWFudGljcywganVzdCB0ZWxsIHdoYXQgaW50ZXJmYWNlIHNwZWMgYSBSZW1vdGFibGUgaGFzLFxuICogb3IgdW5kZWZpbmVkIGlmIG5vdCBkZWVtZWQgdG8gYmUgYSBSZW1vdGFibGUuXG4gKlxuICogQHR5cGUge3tcbiAqIDxUIGV4dGVuZHMgc3RyaW5nPih2YWw6IFBhc3NTdHlsZWQ8YW55LCBUPik6IFQ7XG4gKiAodmFsOiBhbnkpOiBJbnRlcmZhY2VTcGVjIHwgdW5kZWZpbmVkO1xuICogfX1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU9mID0gdmFsID0+IHtcbiAgaWYgKFxuICAgIGlzUHJpbWl0aXZlKHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgcmV0dXJuIGdldFRhZyh2YWwpO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IFJlbW90YWJsZUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3JlbW90YWJsZScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCB2YWxpZFR5cGUgPVxuICAgICAgKCFpc1ByaW1pdGl2ZShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgKCFpc0FycmF5KGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbiAgICAgIC8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG4gICAgICByZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoa2V5ID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gICAgICAgICAgKGhhc093bihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4gICAgICAvKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZTogbmFtZURlc2MsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoRGVzYyxcbiAgICAgICAgLyogQHRzLWlnbm9yZSBUUyBkb2Vzbid0IGxpa2Ugc3ltYm9scyBhcyBjb21wdXRlZCBpbmRleGVzPz8qL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiOlsiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHgA8oUhYAAFIWAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiogQGltcG9ydCB7Q2hlY2tlcn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBpc0Zyb3plbiwgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciwgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cyA9IChwciwgY2hlY2spID0+IHtcbiAgY29uc3Qga2V5cyA9IG93bktleXMocHIpO1xuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gKiBUaGlzIGV4Y2x1ZGVzIHRob3NlIHN5bWJvbC1uYW1lZCBvd24gcHJvcGVydGllcyB0aGF0IGFyZSBhbHNvIGZvdW5kIG9uXG4gKiBgUHJvbWlzZS5wcm90b3R5cGVgLCBzbyB0aGF0IG92ZXJyaWRlcyBvZiB0aGVzZSBwcm9wZXJ0aWVzIGNhbiBiZVxuICogZXhwbGljaXRseSB0b2xlcmF0ZWQgaWYgdGhleSBwYXNzIHRoZSBgY2hlY2tTYWZlT3duS2V5YCBjaGVjayBiZWxvdy5cbiAqIEluIHBhcnRpY3VsYXIsIHdlIHdpc2ggdG8gdG9sZXJhdGVcbiAqICAgKiBBbiBvdmVycmlkaW5nIGB0b1N0cmluZ1RhZ2Agbm9uLWVudW1lcmFibGUgZGF0YSBwcm9wZXJ0eVxuICogICAgIHdpdGggYSBzdHJpbmcgdmFsdWUuXG4gKiAgICogVGhvc2Ugb3duIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlJ3MgYXN5bmNfaG9va3MuXG4gKi9cbiAgY29uc3QgdW5rbm93bktleXMgPSBrZXlzLmZpbHRlcihcbiAgICBrZXkgPT4gdHlwZW9mIGtleSAhPT0gJ3N5bWJvbCcgfHwgIWhhc093bihQcm9taXNlLnByb3RvdHlwZSwga2V5KSxcbiAgKTtcblxuICBpZiAodW5rbm93bktleXMubGVuZ3RoICE9PSAwKSB7XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWA7XG4gIH1cblxuICAvKipcbiAqIEV4cGxpY2l0bHkgdG9sZXJhdGUgYSBgdG9TdHJpbmdUYWdgIHN5bWJvbC1uYW1lZCBub24tZW51bWVyYWJsZVxuICogZGF0YSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZy4gT3RoZXJ3aXNlLCB0b2xlcmF0ZSB0aG9zZVxuICogc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlSlMncyBhc3luY19ob29rcyxcbiAqIGlmIHRoZXkgb2JleSB0aGUgZXhwZWN0ZWQgc2FmZXR5IHByb3BlcnRpZXMuXG4gKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiAgIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG4gIGNvbnN0IGNoZWNrU2FmZU93bktleSA9IGtleSA9PiB7XG4gICAgaWYgKGtleSA9PT0gdG9TdHJpbmdUYWcpIHtcbiAgICAgIC8qIFRPRE8gc2hvdWxkIHdlIGFsc28gZW5mb3JjZSBhbnl0aGluZyBvbiB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZywqL1xuICAgICAgLyogc3VjaCBhcyB0aGF0IGl0IG11c3Qgc3RhcnQgd2l0aCBgJ1Byb21pc2UnYD8qL1xuICAgICAgY29uc3QgdGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihwciwgdG9TdHJpbmdUYWcpO1xuICAgICAgYXNzZXJ0KHRhZ0Rlc2MgIT09IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoaGFzT3duKHRhZ0Rlc2MsICd2YWx1ZScpIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBkYXRhIHByb3BlcnR5LCBub3QgYW4gYWNjZXNzb3I6ICR7cSh0YWdEZXNjKX1gKSAmJlxuICAgICAgICAodHlwZW9mIHRhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIHZhbHVlIG11c3QgYmUgYSBzdHJpbmc6ICR7cSh0YWdEZXNjLnZhbHVlKX1gKSAmJlxuICAgICAgICAoIXRhZ0Rlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAgIENYKGNoZWNrKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke3EodGFnRGVzYyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHByW2tleV07XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbCAhPT0gbnVsbCAmJlxuICAgICAgaXNGcm96ZW4odmFsKSAmJlxuICAgICAgZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZVxuICAgICkge1xuICAgICAgY29uc3Qgc3ViS2V5cyA9IG93bktleXModmFsKTtcbiAgICAgIGlmIChzdWJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzdWJLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBzdWJLZXlzWzBdID09PSAnZGVzdHJveWVkJyAmJlxuICAgICAgICB2YWwuZGVzdHJveWVkID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuICAgICAgU3RyaW5nKGtleSksXG4gICAgKX0gaXMgJHt2YWx9YDtcbiAgfTtcblxuICByZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVPd25LZXkpO1xufTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlID0gKHByLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIChpc0Zyb3plbihwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSAmJlxuICAgIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgICAoZ2V0UHJvdG90eXBlT2YocHIpID09PSBQcm9taXNlLnByb3RvdHlwZSB8fFxuICAgICAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YocHIpLFxuICAgICAgKX1gKSAmJlxuICAgIGNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqLyAocHIpLCBjaGVjaylcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbiAgICAgICBjb25zdCBpc1NhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgeCA9PiB4KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFNhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD8qNkH2w8AANsPAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qIGtub3cgYWJvdXRgaXNXZWxsRm9ybWVkYCovXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kID0gISFTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZDtcblxuLyoqXG4gKiBJcyB0aGUgYXJndW1lbnQgYSB3ZWxsLWZvcm1lZCBzdHJpbmc/XG4gKlxuICogVW5mb3J0dW5hdGVseSwgdGhlXG4gKiBbc3RhbmRhcmQgYnVpbHQtaW4gYFN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkYF0oaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXMtdXN2LXN0cmluZylcbiAqIGRvZXMgYSBUb1N0cmluZyBvbiBpdHMgaW5wdXQsIGNhdXNpbmcgaXQgdG8ganVkZ2Ugbm9uLXN0cmluZ3MgdG8gYmVcbiAqIHdlbGwtZm9ybWVkIHN0cmluZ3MgaWYgdGhleSBjb2VyY2UgdG8gYSB3ZWxsLWZvcm1lZCBzdHJpbmdzLiBUaGlzXG4gKiByZWNhcGl0dWxhdGVzIHRoZSBtaXN0YWtlIGluIGhhdmluZyB0aGUgZ2xvYmFsIGBpc05hTmAgY29lcmNlIGl0cyBpbnB1dHMsXG4gKiBjYXVzaW5nIGl0IHRvIGp1ZGdlIG5vbi1zdHJpbmcgdG8gYmUgTmFOIGlmIHRoZXkgY29lcmNlIHRvIE5hTi5cbiAqXG4gKiBUaGlzIGBpc1dlbGxGb3JtZWRTdHJpbmdgIGZ1bmN0aW9uIG9ubHkganVkZ2VzIHdlbGwtZm9ybWVkIHN0cmluZ3MgdG8gYmVcbiAqIHdlbGwtZm9ybWVkIHN0cmluZ3MuIEZvciBhbGwgbm9uLXN0cmluZ3MgaXQgcmV0dXJucyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHN0clxuICogQHJldHVybnMge3N0ciBpcyBzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBpc1dlbGxGb3JtZWRTdHJpbmcgPSBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kXG4gID8gc3RyID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pc1dlbGxGb3JtZWQoKVxuICA6IHN0ciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaCBvZiBzdHIpIHtcbiAgICAgICAgLyogVGhlIHN0cmluZyBpdGVyYXRvciBpdGVyYXRlcyBieSBVbmljb2RlIGNvZGUgcG9pbnQsIG5vdCovXG4gICAgICAgIC8qIFVURjE2IGNvZGUgdW5pdC4gQnV0IGlmIGl0IGVuY291bnRlcnMgYW4gdW5wYWlyZWQgc3Vycm9nYXRlLCovXG4gICAgICAgIC8qIGl0IHdpbGwgcHJvZHVjZSBpdC4qL1xuICAgICAgICBjb25zdCBjcCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2guY29kZVBvaW50QXQoMCkpO1xuICAgICAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgICAgIC8qIEFsbCBzdXJyb2dhdGVzIGFyZSBpbiB0aGlzIHJhbmdlLiBUaGUgc3RyaW5nIGl0ZXJhdG9yIG9ubHkqL1xuICAgICAgICAgIC8qIHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluIHRoaXMgcmFuZ2UgZm9yIHVucGFpcmVkIHN1cnJvZ2F0ZXMsKi9cbiAgICAgICAgICAvKiB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlIHN0cmluZyBpcyBub3Qgd2VsbC1mb3JtZWQuKi9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxseSB3aGVuIGBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKWAgd291bGQgcmV0dXJuIHRydWUuXG4gKiBUaHJvd3MgYSBkaWFnbm9zdGljIGVycm9yIHdoZW4gYGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpYCB3b3VsZCByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzdHJcbiAqIEByZXR1cm5zIHthc3NlcnRzIHN0ciBpcyBzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gc3RyID0+IHtcbiAgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cikgfHwgRmFpbGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbn07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4gICAgJ2VuYWJsZWQnLFxuICBdKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKipcbiAqIEZvciBub3csXG4gKiBpZiBgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFYCBlbnZpcm9ubWVudCBvcHRpb24gaXMgYCdlbmFibGVkJ2AsXG4gKiB0aGVuIGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AgaXMgdGhlIHNhbWUgYXMgYGFzc2VydFdlbGxGb3JtZWRTdHJpbmdgLlxuICogT3RoZXJ3aXNlIGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AganVzdCBhc3NlcnRzIHRoYXQgYHN0cmAgaXMgYSBzdHJpbmcuXG4gKlxuICogQ3VycmVudGx5LCBgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFYCBkZWZhdWx0cyB0byBgJ2Rpc2FibGVkJ2BcbiAqIGJlY2F1c2Ugd2UgZG8gbm90IHlldCBrbm93IHRoZSBwZXJmb3JtYW5jZSBpbXBhY3QuIExhdGVyLCBpZiB3ZSBkZWNpZGUgd2VcbiAqIGNhbiBhZmZvcmQgaXQsIHdlJ2xsIGZpcnN0IGNoYW5nZSB0aGUgZGVmYXVsdCB0byBgJ2VuYWJsZWQnYCBhbmQgdWx0aW1hdGVseVxuICogcmVtb3ZlIHRoZSBzd2l0Y2ggYWx0b2dldGhlci4gQmUgcHJlcGFyZWQgZm9yIHRoZXNlIGNoYW5nZXMuXG4gKlxuICogVE9ETyBvbmNlIHRoZSBzd2l0Y2ggaXMgcmVtb3ZlZCwgc2ltcGxpZnkgYGFzc2VydFBhc3NhYmxlU3RyaW5nYCB0b1xuICogc2ltcGx5IGJlIGBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nYC5cbiAqXG4gKiBAcGFyYW0geyB1bmtub3duIH0gc3RyXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzdHIgaXMgc3RyaW5nIH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3RyaW5nID0gc3RyID0+IHtcbiAgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgRmFpbGBFeHBlY3RlZCBzdHJpbmcgJHtzdHJ9YDtcbiAgIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSB8fCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKHN0cik7XG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAvc0IsMUAADDFAAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXMgPSBuZXcgTWFwKFxuICBvd25LZXlzKFN5bWJvbClcbiAgICAuZmlsdGVyKFxuICAgICAgbmFtZSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIFN5bWJvbFtuYW1lXSA9PT0gJ3N5bWJvbCcsXG4gICAgKVxuICAgIC5maWx0ZXIobmFtZSA9PiB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4gICAgICAhbmFtZS5zdGFydHNXaXRoKCdAQCcpIHx8XG4gICAgICAgIEZhaWxgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICl9YDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pXG4gICAgLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PlxuICB0eXBlb2Ygc3ltID09PSAnc3ltYm9sJyAmJlxuICAodHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKSA9PT0gJ3N0cmluZycgfHwgd2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRozY9fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgaXNQYXNzYWJsZVN5bWJvbChzeW0pIHx8XG4gIEZhaWxgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbiAgICAgICBjb25zdCBuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSBzeW0gPT4ge1xuICBjb25zdCBuYW1lID0gU3ltYm9sLmtleUZvcihzeW0pO1xuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuICB9XG4gIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpIHtcbiAgICByZXR1cm4gYEBAJHtuYW1lfWA7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59OyRozY9fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sfVxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgJHtxKG5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgIGlmIChzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgICAgcmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ltID0gU3ltYm9sW3N1ZmZpeF07XG4gICAgICBpZiAodHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHN5bTtcbiAgICAgIH1cbiAgICAgIEZhaWxgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xufTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbH1cbiAqL1xuICAgICAgIGNvbnN0IHVucGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiBTeW1ib2wobmFtZSk7JGjNj19vbmNlLnVucGFzc2FibGVTeW1ib2xGb3JOYW1lKHVucGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXLhQ2WQJAABkCQAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGdldE93bkRhdGFEZXNjcmlwdG9yLGNoZWNrUGFzc1N0eWxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLFskaM2PX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBUYWdnZWRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICd0YWdnZWQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlW1BBU1NfU1RZTEVdLCAndGFnZ2VkJywgY2hlY2spLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwgJ3RhZ2dlZCcsIGFzc2VydENoZWNrZXIpO1xuXG4gICAgLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbiAgICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChQQVNTX1NUWUxFKTtcbiAgICBjb25zdCB0YWdLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICAgIGNvbnN0IHtcbiAgICAgIC8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cbiAgICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHRhZ0tleSldOiBfbGFiZWxEZXNjLFxuICAgICAgcGF5bG9hZDogX3BheWxvYWREZXNjLCAvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuICAgICAgLi4ucmVzdERlc2NzXG4gICAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbiAgICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSAncGF5bG9hZCcgcHJvcGVydHkgaXMgb3duL2RhdGEvZW51bWVyYWJsZSovXG4gICAgLyogYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGlzIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlLiovXG4gICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ3BheWxvYWQnLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3XT1cJhYAACYWAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEF0b20iLCJhc3NlcnRCeXRlQXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0F0b20iLCJpc0J5dGVBcnJheSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxYLGlkZW50Q2hlY2tlcixwYXNzU3R5bGVPZixhc3NlcnRDaGVja2VyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgUGFzc2FibGUsIFJlbW90YWJsZU9iamVjdCwgQnl0ZUFycmF5LCBDaGVja2VyLCBBdG9tfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYmluYXJ5IGRhdGEsIEFLQSBhIFwiYnl0ZUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQnl0ZUFycmF5fVxuICovXG4gICAgICAgY29uc3QgaXNCeXRlQXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2J5dGVBcnJheSc7JGjNj19vbmNlLmlzQnl0ZUFycmF5KGlzQnl0ZUFycmF5KTtcbmhhcmRlbihpc0J5dGVBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7YW55fSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNSZWNvcmQgPSByZWNvcmQgPT4gcGFzc1N0eWxlT2YocmVjb3JkKSA9PT0gJ2NvcHlSZWNvcmQnOyRozY9fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbiAgICAgICBjb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYXJyXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5QXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2Fycn0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyIGlzIEJ5dGVBcnJheX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEJ5dGVBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYnl0ZUFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdieXRlQXJyYXknIHx8XG4gICAgRmFpbGAke3EoXG4gICAgICBvcHROYW1lT2ZBcnJheSxcbiAgICApfSAke2Fycn0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBiaW5hcnkgZGF0YSwgbm90ICR7cShwYXNzU3R5bGUpfWA7XG59OyRozY9fb25jZS5hc3NlcnRCeXRlQXJyYXkoYXNzZXJ0Qnl0ZUFycmF5KTtcbmhhcmRlbihhc3NlcnRCeXRlQXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7YW55fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG4gIHJlbW90YWJsZSxcbiAgb3B0TmFtZU9mUmVtb3RhYmxlID0gJ0FsbGVnZWQgcmVtb3RhYmxlJyxcbikgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsIE5vdCBuZWNlc3NhcmlseSBwYXNzYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ZhbCBpcyBBdG9tfVxuICovXG5jb25zdCBjaGVja0F0b20gPSAodmFsLCBjaGVjaykgPT4ge1xuICBsZXQgcGFzc1N0eWxlO1xuICB0cnkge1xuICAgIHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgZXZlbiBQYXNzYWJsZTogJHtxKGVycil9OiAke3ZhbH1gKVxuICAgICk7XG4gIH1cbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLyogVGhlIEF0b21TdHlsZSBjYXNlcyovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogVGhlIG90aGVyIFBhc3NTdHlsZSBjYXNlcyovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhbiBhdG9tOiAke3ZhbH1gKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBBdG9tfVxuICovXG4gICAgICAgY29uc3QgaXNBdG9tID0gdmFsID0+IGNoZWNrQXRvbSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQXRvbShpc0F0b20pO1xuaGFyZGVuKGlzQXRvbSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWwgaXMgQXRvbX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEF0b20gPSB2YWwgPT4ge1xuICBjaGVja0F0b20odmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEF0b20oYXNzZXJ0QXRvbSk7XG5oYXJkZW4oYXNzZXJ0QXRvbSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc0J5dGVBcnJheSI6WyJpc0J5dGVBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydEJ5dGVBcnJheSI6WyJhc3NlcnRCeXRlQXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl0sImlzQXRvbSI6WyJpc0F0b20iXSwiYXNzZXJ0QXRvbSI6WyJhc3NlcnRBdG9tIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIiwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIiwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIiwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImJhZ1VuaW9uIiwiYmFnVW5pb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiLCJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlTZXQuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weUJhZy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbImlzQ29weVNldCIsImlzQ29weVNldCJdLFsiYXNzZXJ0Q29weVNldCIsImFzc2VydENvcHlTZXQiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbImlzQ29weUJhZyIsImlzQ29weUJhZyJdLFsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlCYWciXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdLFsiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlNYXAiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXV0sIi4vc3JjL2tleXMvY29weVNldC5qcyI6W1siY29lcmNlVG9FbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiXV0sIi4vc3JjL2tleXMvY29weUJhZy5qcyI6W1siY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjpbWyJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl1dLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOltbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjpbWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnVW5pb24iLCJiYWdVbmlvbiJdLFsiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSW50ZXJzZWN0aW9uIl0sWyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnRGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjpbWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl0sWyJpc0F3YWl0QXJnR3VhcmQiLCJpc0F3YWl0QXJnR3VhcmQiXSxbImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIl0sWyJpc1Jhd0d1YXJkIiwiaXNSYXdHdWFyZCJdLFsiYXNzZXJ0UmF3R3VhcmQiLCJhc3NlcnRSYXdHdWFyZCJdLFsiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCJdLFsiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdLFsia2luZE9mIiwia2luZE9mIl0sWyJjb250YWluZXJIYXNTcGxpdCIsImNvbnRhaW5lckhhc1NwbGl0Il1dLCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIjpbWyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIl0sWyJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSxbImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldEludGVyZmFjZU1ldGhvZEtleXMiXV0sIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOltbImxpc3REaWZmZXJlbmNlIiwibGlzdERpZmZlcmVuY2UiXV0sIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjpbWyJvYmplY3RNYXAiLCJvYmplY3RNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKohA+kLSAAAC0gAACoAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4vY29weVNldC5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cnlBcnJheSIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEZhaWwsaWRlbnRDaGVja2VyLGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGlzQXRvbSxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNBdG9tXCIsWyRozY9fYSA9PiAoaXNBdG9tID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIixbJGjNj19hID0+IChjaGVja0VsZW1lbnRzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBBdG9tLCBDaGVja2VyfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q29weUJhZywgQ29weU1hcCwgQ29weVNldCwgS2V5LCBTY2FsYXJLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyBBdG9tIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1NjYWxhcktleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIFNjYWxhcktleX1cbiAqLyRozY9fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG4gICAgICAgY29uc3QgaXNTY2FsYXJLZXkgPSB2YWwgPT4gY2hlY2tTY2FsYXJLZXkodmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIFNjYWxhcktleX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFNjYWxhcktleSA9IHZhbCA9PiB7XG4gIGNoZWNrU2NhbGFyS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgS2V5IGRvZXMgbm90IHNhdGlzZnkgV2Vha0tleSovXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgS2V5IGRvZXMgbm90IHNhdGlzZnkgV2Vha0tleSovXG5jb25zdCBrZXlNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0tleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICBpZiAoa2V5TWVtby5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrS2V5SW50ZXJuYWwodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICAvKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbiAgICAvKiB3aXRoIGBhc3NlcnRDaGVja2VyYCBpdCdsbCB0aHJvdyBhIGRpYWdub3N0aWMgYWdhaW4qL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgIGtleU1lbW8uYWRkKHZhbCk7XG4gIH1cbiAgLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbiAgLyogYWdhaW4gd2l0aCBhIGNoZWNrZXIsIGl0IHdpbGwgc3RpbGwgcHJvZHVjZSBhIHVzZWZ1bCBkaWFnbm9zdGljLiovXG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKipcbiAqIEB0eXBlIHt7XG4gKiAgICh2YWw6IFBhc3NhYmxlKTogdmFsIGlzIEtleTtcbiAqICAgKHZhbDogYW55KTogYm9vbGVhbjtcbiAqIH19XG4gKi9cbiAgICAgICBjb25zdCBpc0tleSA9IHZhbCA9PiBjaGVja0tleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIEtleX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEtleSA9IHZhbCA9PiB7XG4gIGNoZWNrS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRLZXkoYXNzZXJ0S2V5KTtcbmhhcmRlbihhc3NlcnRLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlTZXQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weVNldCBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlTZXQ+fSAqL1xuY29uc3QgY29weVNldE1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weVNldCA9IChzLCBjaGVjaykgPT4ge1xuICBpZiAoY29weVNldE1lbW8uaGFzKHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgICAoKHBhc3NTdHlsZU9mKHMpID09PSAndGFnZ2VkJyAmJiBnZXRUYWcocykgPT09ICdjb3B5U2V0JykgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkgJiZcbiAgICBjaGVja0VsZW1lbnRzKHMucGF5bG9hZCwgY2hlY2spICYmXG4gICAgY2hlY2tLZXkocy5wYXlsb2FkLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5U2V0TWVtby5hZGQocyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weVNldChjaGVja0NvcHlTZXQpO1xuaGFyZGVuKGNoZWNrQ29weVNldCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlTZXQgPSBzID0+IGNoZWNrQ29weVNldChzLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlTZXQgPSBzID0+IHtcbiAgY2hlY2tDb3B5U2V0KHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weVNldEtleXMgPSBzID0+IHtcbiAgYXNzZXJ0Q29weVNldChzKTtcbiAgcmV0dXJuIHMucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlTZXRLZXkgPSAocywgZm4pID0+XG4gIGdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5U2V0ID0gZWxlbWVudEl0ZXIgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG4gIGFzc2VydENvcHlTZXQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weUJhZz59ICovXG5jb25zdCBjb3B5QmFnTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5QmFnID0gKGIsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5QmFnTWVtby5oYXMoYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YoYikgPT09ICd0YWdnZWQnICYmIGdldFRhZyhiKSA9PT0gJ2NvcHlCYWcnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weUJhZzogJHtifWApKSAmJlxuICAgIGNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGIucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weUJhZ01lbW8uYWRkKGIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnfVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QmFnID0gYiA9PiBjaGVja0NvcHlCYWcoYiwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5QmFnID0gYiA9PiB7XG4gIGNoZWNrQ29weUJhZyhiLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlCYWdFbnRyaWVzID0gYiA9PiB7XG4gIGFzc2VydENvcHlCYWcoYik7XG4gIHJldHVybiBiLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEBwYXJhbSB7KGVudHJ5OiBbSywgYmlnaW50XSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5QmFnRW50cnkgPSAoYiwgZm4pID0+XG4gIGdldENvcHlCYWdFbnRyaWVzKGIpLmV2ZXJ5KChlbnRyeSwgaW5kZXgpID0+IGZuKGVudHJ5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlCYWcgPSBiYWdFbnRyeUl0ZXIgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG4gIGFzc2VydENvcHlCYWcocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbiAgY29uc3Qgc29ydGVkID0gc29ydEJ5UmFuayhlbGVtZW50SXRlciwgZnVsbENvbXBhcmUpO1xuICAvKiogQHR5cGUge1tLLGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGsgPSBzb3J0ZWRbaV07XG4gICAgbGV0IGogPSBpICsgMTtcbiAgICB3aGlsZSAoaiA8IHNvcnRlZC5sZW5ndGggJiYgZnVsbENvbXBhcmUoaywgc29ydGVkW2pdKSA9PT0gMCkge1xuICAgICAgaiArPSAxO1xuICAgIH1cbiAgICBlbnRyaWVzLnB1c2goW2ssIEJpZ0ludChqIC0gaSldKTtcbiAgICBpID0gajtcbiAgfVxuICByZXR1cm4gbWFrZUNvcHlCYWcoZW50cmllcyk7XG59OyRozY9fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlNYXAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weU1hcCdzIGtleXMgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5TWFwPn0gKi9cbmNvbnN0IGNvcHlNYXBNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlNYXAgPSAobSwgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlNYXBNZW1vLmhhcyhtKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghKHBhc3NTdHlsZU9mKG0pID09PSAndGFnZ2VkJyAmJiBnZXRUYWcobSkgPT09ICdjb3B5TWFwJykpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgTm90IGEgY29weU1hcDogJHttfWApO1xuICB9XG4gIGNvbnN0IHsgcGF5bG9hZCB9ID0gbTtcbiAgaWYgKHBhc3NTdHlsZU9mKHBheWxvYWQpICE9PSAnY29weVJlY29yZCcpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBrZXlzLCB2YWx1ZXMsIC4uLnJlc3QgfSA9IHBheWxvYWQ7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IG9ubHkgaGF2ZSAua2V5cyBhbmQgLnZhbHVlczogJHttfWAsXG4gICAgICApKSAmJlxuICAgIGNoZWNrRWxlbWVudHMoa2V5cywgY2hlY2spICYmXG4gICAgY2hlY2tLZXkoa2V5cywgY2hlY2spICYmXG4gICAgKHBhc3NTdHlsZU9mKHZhbHVlcykgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyAudmFsdWVzIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7bX1gKSkgJiZcbiAgICAoa2V5cy5sZW5ndGggPT09IHZhbHVlcy5sZW5ndGggfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gLFxuICAgICAgKSk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5TWFwTWVtby5hZGQobSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weU1hcChjaGVja0NvcHlNYXApO1xuaGFyZGVuKGNoZWNrQ29weU1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlNYXAgPSBtID0+IGNoZWNrQ29weU1hcChtLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlNYXAgPSBtID0+IHtcbiAgY2hlY2tDb3B5TWFwKG0sIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwS2V5cyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLmtleXM7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge1ZbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBWYWx1ZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYSBDb3B5TWFwJ3MgZW50cmllcyBpbiBzdG9yYWdlIG9yZGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0FycmF5PFtLLFZdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBFbnRyeUFycmF5ID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkOiB7IGtleXMsIHZhbHVlcyB9LFxuICB9ID0gbTtcbiAgcmV0dXJuIGhhcmRlbihrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWx1ZXNbaV1dKSk7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cnlBcnJheShnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBFbnRyaWVzID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkOiB7IGtleXMsIHZhbHVlcyB9LFxuICB9ID0gbTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovIChrZXlzKTtcbiAgcmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xuICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogW2tleXNbaV0sIHZhbHVlc1tpXV0gfSk7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlNYXBLZXkgPSAobSwgZm4pID0+XG4gIGdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwVmFsdWUgPSAobSwgZm4pID0+XG4gIGdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gZm4odmFsdWUsIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IGNvcHlNYXBLZXlTZXQgPSBtID0+XG4gIC8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgbS5wYXlsb2FkLmtleXMpOyRozY9fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBWXT59IGVudHJpZXNcbiAqIEByZXR1cm5zIHtDb3B5TWFwPEssVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weU1hcCA9IGVudHJpZXMgPT4ge1xuICAvKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuICAvKiBmb3IgZ2V0dGluZyB0aGUgcmFuayBzb3J0ZWQga2V5cyB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZXMqL1xuICAvKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4gIC8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuICAvKiBUT0RPIFRoaXMqL1xuICAvKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4gIC8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuICAvKiB3aGljaCB3ZSBjdXJyZW50bHkgZG8gbm90LiovXG4gIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBzb3J0QnlSYW5rKGVudHJpZXMsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGNvbnN0IGtleXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW2ssIF92XSkgPT4gayk7XG4gIGNvbnN0IHZhbHVlcyA9IHNvcnRlZEVudHJpZXMubWFwKChbX2ssIHZdKSA9PiB2KTtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnY29weU1hcCcsIHsga2V5cywgdmFsdWVzIH0pO1xuICBhc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYGNoZWNrS2V5SW50ZXJuYWxgIGlzIG9ubHkgY2FsbGVkIGlmIGB2YWxgIGlzIFBhc3NhYmxlIGJ1dCBpcyBub3QgYW4gQXRvbS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbCA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja0tleShjaGlsZCwgY2hlY2spO1xuXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgLyogQSByZW1vdGFibGUgaXMgYSBTY2FsYXJLZXkgYnV0IG5vdCBhbiBBdG9tLCBzbyB3ZSBwaWNrIGl0IHVwIGhlcmUuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbiAgICAgIHJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyh2YWwpO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVja0NvcHlNYXAodmFsLCBjaGVjaykgJiZcbiAgICAgICAgICAgIC8qIEZvciBhIGNvcHlNYXAgdG8gYmUgYSBrZXksIGFsbCBpdHMga2V5cyBhbmQgdmFsdWVzIG11c3QqL1xuICAgICAgICAgICAgLyogYmUga2V5cy4gS2V5cyBhbHJlYWR5IGNoZWNrZWQgYnkgYGNoZWNrQ29weU1hcGAgc2luY2UqL1xuICAgICAgICAgICAgLyogdGhhdCdzIGEgY29weU1hcCByZXF1aXJlbWVudCBpbiBnZW5lcmFsLiovXG4gICAgICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZSh2YWwsIGNoZWNrSXQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjYXNlICdlcnJvcic6XG4gICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1rZXlzLCBidXQgYW4gdW5leHBlY3RlZCBwYXNzU3R5bGUqL1xuICAgICAgLyogaXMgYWx3YXlzIGFuIGVycm9yLiovXG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiAgICB9XG4gIH1cbn07XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiOlsiZ2V0Q29weU1hcEVudHJ5QXJyYXkiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/9srkD8oAAA/KAAALQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jaGVja0tleS5qcyIsIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJzZXRDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVOdW1lcmljcyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMscSxGYWlsLGFzc2VydEtleSxnZXRDb3B5QmFnRW50cmllcyxnZXRDb3B5TWFwRW50cnlBcnJheSxnZXRDb3B5U2V0S2V5cyxtYWtlQ29tcGFyZUNvbGxlY3Rpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJjb21wYXJlTnVtZXJpY3NcIixbJGjNj19hID0+IChjb21wYXJlTnVtZXJpY3MgPSAkaM2PX2EpXV0sW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJtYWtlQ29tcGFyZUNvbGxlY3Rpb25cIixbJGjNj19hID0+IChtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0NvcHlTZXQsIEtleSwgS2V5Q29tcGFyZX0gZnJvbSAnLi4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQ29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5U2V0IFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGQ6XG4gKiAxLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWS5cbiAqIDIuIFRoZXJlIGlzIGEgeSBpbiBZIHRoYXQgaXMgbm90IGluIFguXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIHRoZSBjb25kaXRpb24gMSBob2xkcyBidXQgY29uZGl0aW9uIDIgZG9lcyBub3QuXG4gKi9cbiAgICAgICBjb25zdCBzZXRDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICAvKiogQHR5cGUgezxLIGV4dGVuZHMgS2V5PihzOiBDb3B5U2V0PEs+KSA9PiBBcnJheTxbSywgMV0+fSAqLyAoXG4gICAgcyA9PiBoYXJkZW4oZ2V0Q29weVNldEtleXMocykubWFwKGtleSA9PiBba2V5LCAxXSkpXG4gICksXG4gIDAsXG4gIGNvbXBhcmVOdW1lcmljcyxcbik7JGjNj19vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5oYXJkZW4oc2V0Q29tcGFyZSk7XG5cbi8qKlxuICogQ29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5QmFnIFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGRcbiAqICh3aGVyZSBgY291bnQoQSwgYSlgIGlzIHNob3J0aGFuZCBmb3IgdGhlIGNvdW50IGFzc29jaWF0ZWQgd2l0aCBgYWAgaW4gYEFgKTpcbiAqIDEuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZIGFuZCBjb3VudChYLCB4KSA8PSBjb3VudChZLCB4KS5cbiAqIDIuIFRoZXJlIGlzIGEgeSBpbiBZIHN1Y2ggdGhhdCB5IGlzIG5vdCBpbiBYIG9yIGNvdW50KFgsIHkpIDwgY291bnQoWSwgeSkuXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIHRoZSBjb25kaXRpb24gMSBob2xkcyBidXQgY29uZGl0aW9uIDIgZG9lcyBub3QuXG4gKi9cbiAgICAgICBjb25zdCBiYWdDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5QmFnRW50cmllcyxcbiAgMG4sXG4gIGNvbXBhcmVOdW1lcmljcyxcbik7JGjNj19vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5oYXJkZW4oYmFnQ29tcGFyZSk7XG5cbi8qIFRPRE8gVGhlIGRlc2lyZWQgc2VtYW50aWNzIGZvciBDb3B5TWFwIGNvbXBhcmlzb24gaGF2ZSBub3QgeWV0IGJlZW4gZGVjaWRlZC4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MzcjcHVsbHJlcXVlc3RyZXZpZXctMTU5NjU5NTQxMSovXG4vKiBUaGUgYmVsb3cgaXMgYSBjdXJyZW50bHktdW51c2VkIGV4dGVuc2lvbiBvZiBDb3B5QmFnIHNlbWFudGljcyAoaS5lLiwgYWJzZW50Ki9cbi8qIGVudHJpZXMgdHJlYXRlZCBhcyBwcmVzZW50IHdpdGggYSB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgdGhhbiBldmVyeXRoaW5nKS4qL1xuLyoqXG4gKiBBIHVuaXF1ZSBsb2NhbCB2YWx1ZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gbm90IGV4aXN0IGluIGFueSBpbmJvdW5kIGRhdGFcbiAqIHN0cnVjdHVyZSAod2hpY2ggd291bGQgbm90IGJlIHRoZSBjYXNlIGlmIHdlIHVzZWQgYFN5bWJvbC5mb3JgKS5cbiAqIE5vdGUgdGhhdCBgQUJTRU5UYCBpcyBub3QgcGFzc2FibGUsIGFuZCBzbyBvbmx5IGV4aXN0cyBhdCB0aGUgSlMgbGV2ZWwgb2ZcbiAqIGFic3RyYWN0aW9uLCBub3QgcGFzcy1zdHlsZS5cbiAqL1xuY29uc3QgQUJTRU5UID0gU3ltYm9sKCdhYnNlbnQnKTtcblxuLyoqXG4gKiBDb3B5TWFwIFggaXMgc21hbGxlciB0aGFuIENvcHlNYXAgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZDpcbiAqIDEuIFggYW5kIFkgYXJlIGJvdGggS2V5cyAoaS5lLiwgbmVpdGhlciBjb250YWlucyBub24tY29tcGFyYWJsZSBkYXRhKS5cbiAqIDIuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZIGFuZCBYW3hdIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIFlbeF0uXG4gKiAzLiBUaGVyZSBpcyBhIHkgaW4gWSBzdWNoIHRoYXQgeSBpcyBub3QgaW4gWCBvciBYW3ldIGlzIHNtYWxsZXIgdGhhbiBZW3ldLlxuICpcbiAqIFggaXMgZXF1aXZhbGVudCB0byBZIGlmZiBjb25kaXRpb25zIDEgYW5kIDIgaG9sZCBidXQgY29uZGl0aW9uIDMgZG9lcyBub3QuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSovXG5jb25zdCBfbWFwQ29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gIEFCU0VOVCxcbiAgKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSkgPT4ge1xuICAgIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCAmJiByaWdodFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHRocm93IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgYWJzZW50IGVudHJ5IHBhaXJgO1xuICAgIH0gZWxzZSBpZiAobGVmdFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY29tcGFyZUtleXMobGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgICB9XG4gIH0sXG4pO1xuaGFyZGVuKF9tYXBDb21wYXJlKTtcblxuLyoqIEB0eXBlIHtLZXlDb21wYXJlfSAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVLZXlzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydEtleShsZWZ0KTtcbiAgYXNzZXJ0S2V5KHJpZ2h0KTtcbiAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gIGNvbnN0IHJpZ2h0U3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodCk7XG4gIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAvKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdieXRlQXJyYXknOlxuICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgIC8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xuICAgICAgcmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQsIHJpZ2h0KTtcbiAgICB9XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgcmFua0NvbXAgPSBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgICBpZiAocmFua0NvbXAgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGxlZnQpIHx8IE51bWJlci5pc05hTihyaWdodCkpIHtcbiAgICAgICAgLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbiAgICAgICAgYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCkgfHwgIU51bWJlci5pc05hTihyaWdodCkpO1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbiAgICAgIC8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xuICAgICAgcmV0dXJuIHJhbmtDb21wO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbiAgICAgIC8qIGluY29tbWVuc3VyYXRlLiovXG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4gICAgICAvKiByYW5rIG9yZGVyLiovXG4gICAgICAvKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbiAgICAgIC8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJlS2V5cyhsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4gICAgICAvKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICByZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAvKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgaWYgKCFrZXlFUShsZWZ0TmFtZXMsIHJpZ2h0TmFtZXMpKSB7XG4gICAgICAgIC8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4gICAgICAgIC8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4gICAgICAgIC8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbiAgICAgICAgLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuICAgICAgICAvKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZWZ0VmFsdWVzID0gcmVjb3JkVmFsdWVzKGxlZnQsIGxlZnROYW1lcyk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHJpZ2h0LCByaWdodE5hbWVzKTtcbiAgICAgIC8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbiAgICAgIC8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG4gICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdFZhbHVlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBjb21wID0gY29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSwgcmlnaHRWYWx1ZXNbaV0pO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGNvbXApKSB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ICE9PSBjb21wICYmIGNvbXAgIT09IDApIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjb21wO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIChyZXN1bHQgPT09IC0xICYmIGNvbXAgPT09IDEpIHx8IChyZXN1bHQgPT09IDEgJiYgY29tcCA9PT0gLTEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuICAgICAgLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuICAgICAgLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbiAgICAgIC8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbiAgICAgIC8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4gICAgICAvKiBwcm9wZXJ0eSBuYW1lcy4qL1xuICAgICAgLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnRUYWcgPSBnZXRUYWcobGVmdCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0VGFnID0gZ2V0VGFnKHJpZ2h0KTtcbiAgICAgIGlmIChsZWZ0VGFnICE9PSByaWdodFRhZykge1xuICAgICAgICAvKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChsZWZ0VGFnKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgICAgcmV0dXJuIHNldENvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgICAgcmV0dXJuIGJhZ0NvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgLyogVE9ETyBUaGUgZGVzaXJlZCBzZW1hbnRpY3MgZm9yIENvcHlNYXAgY29tcGFyaXNvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZWNpZGVkLiovXG4gICAgICAgICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MzcjcHVsbHJlcXVlc3RyZXZpZXctMTU5NjU5NTQxMSovXG4gICAgICAgICAgdGhyb3cgRmFpbGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG4gICAgICAgY29uc3Qga2V5TFQgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8IDA7JGjNj19vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbiAgICAgICBjb25zdCBrZXlMVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8PSAwOyRozY9fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG4gICAgICAgY29uc3Qga2V5RVEgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA9PT0gMDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuICAgICAgIGNvbnN0IGtleUdURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID49IDA7JGjNj19vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbiAgICAgICBjb25zdCBrZXlHVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID4gMDskaM2PX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADRbU2NNFQAATRUAACkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q2hlY2tlciwgRnVsbENvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHlcbiAqIGtub3duIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0XG4gKiByYXRoZXIgdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZVxuICogYXJyYXkgZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUta2V5cyBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICAvKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4gIC8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4gIC8qIHNvcnRpbmcgYnkgZnVsbE9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBkdXBsaWNhdGUga2V5cyovXG4gIC8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuICBiYWdFbnRyaWVzID0gc29ydEJ5UmFuayhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBiYWdFbnRyaWVzO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgazAgPSBiYWdFbnRyaWVzW2kgLSAxXVswXTtcbiAgICBjb25zdCBrMSA9IGJhZ0VudHJpZXNbaV1bMF07XG4gICAgaWYgKGZ1bGxDb21wYXJlKGswLCBrMSkgPT09IDApIHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbiAgICAgICBjb25zdCBjaGVja0JhZ0VudHJpZXMgPSAoYmFnRW50cmllcywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpICE9PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBpZiAoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gLFxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKSB7XG4gICAgaWYgKFxuICAgICAgcGFzc1N0eWxlT2YoZW50cnkpICE9PSAnY29weUFycmF5JyB8fFxuICAgICAgZW50cnkubGVuZ3RoICE9PSAyIHx8XG4gICAgICB0eXBlb2YgZW50cnlbMV0gIT09ICdiaWdpbnQnXG4gICAgKSB7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChlbnRyeVsxXSA8IDEpIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gIHJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCB1bmRlZmluZWQsIGNoZWNrKTtcbn07JGjNj19vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sgLS0gZG9lc24ndCB1bmRlcnN0YW5kIGFzc2VydHMqL1xuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHthc3NlcnRzIGJhZ0VudHJpZXMgaXMgW1Bhc3NhYmxlLGJpZ2ludF1bXX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEJhZ0VudHJpZXMgPSBiYWdFbnRyaWVzID0+IHtcbiAgY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJpZXNMaXN0XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VUb0JhZ0VudHJpZXMgPSBiYWdFbnRyaWVzTGlzdCA9PiB7XG4gIGNvbnN0IGJhZ0VudHJpZXMgPSBzb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LCBjb21wYXJlQW50aVJhbmspO1xuICBhc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xuICByZXR1cm4gYmFnRW50cmllcztcbn07JGjNj19vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUJhZ09mRW50cmllcyA9IGJhZ0VudHJ5SXRlciA9PlxuICBtYWtlVGFnZ2VkKCdjb3B5QmFnJywgY29lcmNlVG9CYWdFbnRyaWVzKGJhZ0VudHJ5SXRlcikpOyRozY9fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIjpbImFzc2VydE5vRHVwbGljYXRlS2V5cyJdLCJjaGVja0JhZ0VudHJpZXMiOlsiY2hlY2tCYWdFbnRyaWVzIl0sImFzc2VydEJhZ0VudHJpZXMiOlsiYXNzZXJ0QmFnRW50cmllcyJdLCJjb2VyY2VUb0JhZ0VudHJpZXMiOlsiY29lcmNlVG9CYWdFbnRyaWVzIl0sIm1ha2VCYWdPZkVudHJpZXMiOlsibWFrZUJhZ09mRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAsI4MmLBEAACwRAAApAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcImlzUmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBGdWxsQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0NvcHlTZXQsIEtleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXMgPSAoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIC8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbiAgLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG4gIGZ1bGxDb21wYXJlID0gZnVsbENvbXBhcmUgfHwgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBlbGVtZW50cyA9IHNvcnRCeVJhbmsoZWxlbWVudHMsIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVsZW1lbnRzO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgazAgPSBlbGVtZW50c1tpIC0gMV07XG4gICAgY29uc3QgazEgPSBlbGVtZW50c1tpXTtcbiAgICBpZiAoZnVsbENvbXBhcmUoazAsIGsxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnROb0R1cGxpY2F0ZXMgPSAoZWxlbWVudHMsIGZ1bGxDb21wYXJlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuICAgICAgIGNvbnN0IGNoZWNrRWxlbWVudHMgPSAoZWxlbWVudHMsIGNoZWNrKSA9PiB7XG4gIGlmIChwYXNzU3R5bGVPZihlbGVtZW50cykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLCB1bmRlZmluZWQsIGNoZWNrKTtcbn07JGjNj19vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRFbGVtZW50cyA9IGVsZW1lbnRzID0+IHtcbiAgY2hlY2tFbGVtZW50cyhlbGVtZW50cywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50c0xpc3RcbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvRWxlbWVudHMgPSBlbGVtZW50c0xpc3QgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IHNvcnRCeVJhbmsoZWxlbWVudHNMaXN0LCBjb21wYXJlQW50aVJhbmspO1xuICBhc3NlcnRFbGVtZW50cyhlbGVtZW50cyk7XG4gIHJldHVybiBlbGVtZW50cztcbn07JGjNj19vbmNlLmNvZXJjZVRvRWxlbWVudHMoY29lcmNlVG9FbGVtZW50cyk7XG5oYXJkZW4oY29lcmNlVG9FbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRPZkVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaM2PX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbNZpAwyIAAMMiAAA5AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyIsIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUFycmF5SXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIFJlZmluZXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzIHRoYXQgaXMgYWxyZWFkeSBzb3J0ZWQgb3ZlciBpdHMga2V5cyBieSB0aGVcbiAqIGByYW5rQ29tcGFyZWAgcHJlb3JkZXIsIHdoZXJlIHRoZXJlIG1heSBiZSBpbnRlcm5hbCBydW5zIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLCBpbnRvIGFuIGl0ZXJhYmxlIHRoYXQgcmVzb2x2ZXMgdGhvc2UgdGllcyB1c2luZyBgZnVsbENvbXBhcmVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHtBcnJheTxbS2V5LCBWXT59IGVudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8W0tleSwgVl0+fVxuICovXG5jb25zdCBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzID0gKGVudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICBhc3NlcnRSYW5rU29ydGVkKGVudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IHNhbWVSYW5rSXRlcmF0b3I7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGlmIChzYW1lUmFua0l0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgICAvKiBMb29rIGFoZWFkIGZvciBzYW1lLXJhbmsgdGllcy4qL1xuICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBlbnRyaWVzW2pdWzBdKSA9PT0gMCkge1xuICAgICAgICBqICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgLyogTm8gdGllcyBmb3VuZC4qL1xuICAgICAgICBpID0gajtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50cnkgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0aWVzID0gZW50cmllcy5zbGljZShpLCBqKTtcbiAgICAgIGkgPSBqO1xuXG4gICAgICAvKiBTb3J0IHRoZSB0aWVzIGJ5IGBmdWxsQ29tcGFyZWAsIGVuZm9yY2Uga2V5IHVuaXF1ZW5lc3MsIGFuZCBkZWxlZ2F0ZSB0byovXG4gICAgICAvKiBhIHN1Yi1pdGVyYXRvci4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgICAgIGNvbnN0IHNvcnRlZFRpZXMgPSBzb3J0QnlSYW5rKHRpZXMsIGZ1bGxDb21wYXJlKTtcbiAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgc29ydGVkVGllcy5sZW5ndGg7IGsgKz0gMSkge1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICAgICAgICBjb25zdCBba2V5MF0gPSBzb3J0ZWRUaWVzW2sgLSAxXTtcbiAgICAgICAgY29uc3QgW2tleTFdID0gc29ydGVkVGllc1trXTtcbiAgICAgICAgTWF0aC5zaWduKGZ1bGxDb21wYXJlKGtleTAsIGtleTEpKSB8fFxuICAgICAgICAgIEZhaWxgRHVwbGljYXRlIGVudHJ5IGtleTogJHtrZXkwfWA7XG4gICAgICB9XG4gICAgICBzYW1lUmFua0l0ZXJhdG9yID0gbWFrZUFycmF5SXRlcmF0b3Ioc29ydGVkVGllcyk7XG4gICAgICByZXR1cm4gc2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICB9KTtcbn07XG5oYXJkZW4oZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IG1lcmdlcyByZXZlcnNlLXJhbmstc29ydGVkIFtrZXksIHZhbHVlXSBlbnRyaWVzIG9mXG4gKiB0d28gS2V5Q29sbGVjdGlvbnMgaW50byBhIHJldmVyc2UtZnVsbC1zb3J0ZWQgW2tleSwgdmFsdWUxLCB2YWx1ZTJdIGVudHJpZXNcbiAqIGJ5IHRoZSBrZXkgdGhleSBoYXZlIGluIGNvbW1vbiwgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluXG4gKiBlaXRoZXIgY29sbGVjdGlvbiBhcyBgYWJzZW50VmFsdWVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbQz1LZXlDb2xsZWN0aW9uXVxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0ge0N9IGMxXG4gKiBAcGFyYW0ge0N9IGMyXG4gKiBAcGFyYW0geyhjb2xsZWN0aW9uOiBDKSA9PiBBcnJheTxbS2V5LCBWXT59IGdldEVudHJpZXNcbiAqIEBwYXJhbSB7YW55fSBhYnNlbnRWYWx1ZVxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8W0tleSwgViB8IGFic2VudFZhbHVlLCBWIHwgYWJzZW50VmFsdWVdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gKFxuICBjMSxcbiAgYzIsXG4gIGdldEVudHJpZXMsXG4gIGFic2VudFZhbHVlLFxuKSA9PiB7XG4gIGNvbnN0IGUxID0gZ2V0RW50cmllcyhjMSk7XG4gIGNvbnN0IGUyID0gZ2V0RW50cmllcyhjMik7XG5cbiAgLyogRXN0YWJsaXNoIGEgaGlzdG9yeS1kZXBlbmRlbnQgY29tcGFyaXNvbiBzY29wZWQgdG8gdGhlIGFjdGl2ZSBpbnZvY2F0aW9uKi9cbiAgLyogYW5kIHVzZSBpdCB0byBtYXAgcmV2ZXJzZS1wcmVvcmRlcmVkIGVudHJpZXMgaW50byBhbiBpdGVyYXRvciB3aXRoIGEqL1xuICAvKiBuYXJyb3dlciB0b3RhbCBvcmRlci4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHggPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUxLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeSA9IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMoZTIsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuXG4gIC8qIE1haW50YWluIGEgc2luZ2xlLXJlc3VsdCB7IGRvbmUsIGtleSwgdmFsdWUgfSBidWZmZXIgZm9yIGVhY2ggaXRlcmF0b3IqL1xuICAvKiBzbyB0aGV5IGNhbiBiZSBtZXJnZWQuKi9cbiAgbGV0IHhEb25lO1xuICBsZXQgeEtleTtcbiAgbGV0IHhWYWx1ZTtcbiAgbGV0IHlEb25lO1xuICBsZXQgeUtleTtcbiAgbGV0IHlWYWx1ZTtcbiAgY29uc3Qgbm9uRW50cnkgPSBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xuICBjb25zdCBuZXh0WCA9ICgpID0+IHtcbiAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgY29uc3QgcmVzdWx0ID0geFZhbHVlO1xuICAgICh7IGRvbmU6IHhEb25lLCB2YWx1ZTogW3hLZXksIHhWYWx1ZV0gPSBub25FbnRyeSB9ID0geC5uZXh0KCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG5leHRYKCk7XG4gIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB5VmFsdWU7XG4gICAgKHsgZG9uZTogeURvbmUsIHZhbHVlOiBbeUtleSwgeVZhbHVlXSA9IG5vbkVudHJ5IH0gPSB5Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFkoKTtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAvKiogQHR5cGUge1tLZXksIFYgfCBhYnNlbnRWYWx1ZSwgViB8IGFic2VudFZhbHVlXX0gKi9cbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHZhbHVlID0gW3VuZGVmaW5lZCwgYWJzZW50VmFsdWUsIGFic2VudFZhbHVlXTtcbiAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt5S2V5LCBhYnNlbnRWYWx1ZSwgbmV4dFkoKV07XG4gICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBDb21wYXJlIHRoZSBrZXlzIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgcmV0dXJuIGEgbWVyZ2VkIHJlc3VsdCovXG4gICAgICAvKiBvciBhIG9uZS1zaWRlZCByZXN1bHQuKi9cbiAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4S2V5LCB5S2V5KTtcbiAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIG5leHRZKCldO1xuICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEZhaWxgVW5leHBlY3RlZCBrZXkgY29tcGFyaXNvbiAke3EoY29tcCl9IGZvciAke3hLZXl9IHZzICR7eUtleX1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gIH0pO1xufTskaM2PX29uY2UuZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuaGFyZGVuKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyB0d28gS2V5Q29sbGVjdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSB1c2luZ1xuICogdGhlIHByb3ZpZGVkIGVudHJpZXMgZmFjdG9yeSBhbmQgc2FtZS1rZXkgZW50cnkgdmFsdWUgY29tcGFyYXRvciAod2hlcmUgdGhlXG4gKiB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluIG9uZSBjb2xsZWN0aW9uIGlzIGBhYnNlbnRWYWx1ZWApLlxuICpcbiAqIElmIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgZm9yIGFueSBzaW5nbGUga2V5IGFyZSBpbmNvbXBhcmFibGUgb3IgdGhlXG4gKiBjb21wYXJpc29uIHJlc3VsdCBoYXMgdGhlIG9wcG9zaXRlIHNpZ24gb2YgdGhlIHJlc3VsdCBmb3IgYSBkaWZmZXJlbnQga2V5LFxuICogdGhlbiB0aGUgS2V5Q29sbGVjdGlvbnMgYXJlIGluY29tcGFyYWJsZS4gT3RoZXJ3aXNlLCB0aGUgY29sbGVjdGlvbnMgY29tcGFyZVxuICogYnkgdGhlIHJlc3VsdCBvZiBhbnkgbm9uLWVxdWFsIGVudHJ5IGNvbXBhcmlzb24sIG9yIGNvbXBhcmUgZXF1YWwgaWYgdGhlcmUgaXNcbiAqIG5vIG5vbi1lcXVhbCBlbnRyeSBjb21wYXJpc29uIHJlc3VsdC5cbiAqIEZvciBleGFtcGxlLCBnaXZlbiBDb3B5QmFncyBYIGFuZCBZIGFuZCBhIHZhbHVlIGNvbXBhcmF0b3IgdGhhdCBnb2VzIGJ5IGNvdW50XG4gKiAoZGVmYXVsdGluZyBhYnNlbnQga2V5cyB0byBhIGNvdW50IG9mIDApLCBYIGlzIHNtYWxsZXIgdGhhbiBZIChgcmVzdWx0IDwgMGApXG4gKiBpZmYgdGhlcmUgYXJlIG5vIGtleXMgaW4gWCB0aGF0IGFyZSBlaXRoZXIgYWJzZW50IGZyb20gWVxuICogKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgYWJzZW50VmFsdWUpID4gMGApIG9yIHByZXNlbnQgaW4gWSB3aXRoIGEgbG93ZXIgY291bnRcbiAqIChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPiAwYCkgQU5EIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBrZXkgaW4gWSB0aGF0XG4gKiBpcyBlaXRoZXIgYWJzZW50IGZyb20gWCAoYGNvbXBhcmVWYWx1ZXMoYWJzZW50VmFsdWUsIHlDb3VudCkgPCAwYCkgb3IgcHJlc2VudFxuICogd2l0aCBhIGxvd2VyIGNvdW50IChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPCAwYCkuXG4gKlxuICogVGhpcyBjYW4gYmUgZ2VuZXJhbGl6ZWQgdG8gdmlydHVhbCBjb2xsZWN0aW9ucyBpbiB0aGUgZnV0dXJlIGJ5IHJlcGxhY2luZ1xuICogYGdldEVudHJpZXMgPT4gQXJyYXlgIHdpdGggYGdlbmVyYXRlRW50cmllcyA9PiBJdGVyYWJsZUl0ZXJhdG9yYC5cbiAqXG4gKiBAdGVtcGxhdGUgW0M9S2V5Q29sbGVjdGlvbl1cbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHsoY29sbGVjdGlvbjogQykgPT4gQXJyYXk8W0tleSwgVl0+fSBnZXRFbnRyaWVzXG4gKiBAcGFyYW0ge1Z9IGFic2VudFZhbHVlXG4gKiBAcGFyYW0ge0tleUNvbXBhcmV9IGNvbXBhcmVWYWx1ZXNcbiAqIEByZXR1cm5zIHsobGVmdDogQywgcmlnaHQ6IEMpID0+IEtleUNvbXBhcmlzb259XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAoZ2V0RW50cmllcywgYWJzZW50VmFsdWUsIGNvbXBhcmVWYWx1ZXMpID0+XG4gIGhhcmRlbigobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCBtZXJnZWQgPSBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbiAgICAgIGxlZnQsXG4gICAgICByaWdodCxcbiAgICAgIGdldEVudHJpZXMsXG4gICAgICBhYnNlbnRWYWx1ZSxcbiAgICApO1xuICAgIGxldCBsZWZ0SXNCaWdnZXIgPSBmYWxzZTtcbiAgICBsZXQgcmlnaHRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW19rZXksIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZV0gb2YgbWVyZ2VkKSB7XG4gICAgICBjb25zdCBjb21wID0gY29tcGFyZVZhbHVlcyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlKi9cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIC8qIEJhc2VkIG9uIHRoaXMga2V5LCBsZWZ0IDwgcmlnaHQuKi9cbiAgICAgICAgcmlnaHRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIC8qIEJhc2VkIG9uIHRoaXMga2V5LCBsZWZ0ID4gcmlnaHQuKi9cbiAgICAgICAgbGVmdElzQmlnZ2VyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE51bWJlci5pc05hTihjb21wKSB8fFxuICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICAgICAgRmFpbGBVbmV4cGVjdGVkIHZhbHVlIGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHtsZWZ0VmFsdWV9IHZzICR7cmlnaHRWYWx1ZX1gO1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRJc0JpZ2dlciAmJiByaWdodElzQmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG4gICAgcmV0dXJuIGxlZnRJc0JpZ2dlciA/IDEgOiByaWdodElzQmlnZ2VyID8gLTEgOiAwO1xuICB9KTskaM2PX29uY2UubWFrZUNvbXBhcmVDb2xsZWN0aW9uKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG5oYXJkZW4obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIl0sIm1ha2VDb21wYXJlQ29sbGVjdGlvbiI6WyJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmcQ4AVcoAABXKAAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIixbJGjNj19hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RnVsbENvbXBhcmUsIFJhbmtDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7S2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCB0aGF0IGZpbGUgYW5kIGtleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydCA9IChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBiYWdFbnRyaWVzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBvcHRJbm5lckl0ZXJhdG9yO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT5cbiAgICAgIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAob3B0SW5uZXJJdGVyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoKi9cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGJhZ0VudHJpZXNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICBqIDwgbGVuZ3RoICYmXG4gICAgICAgICAgICAgIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBiYWdFbnRyaWVzW2pdWzBdKSA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gYmFnRW50cmllcy5zbGljZShpLCBqKTtcbiAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBzb3J0QnlSYW5rKHNpbWlsYXJSdW4sIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbiAgICAgICAgICAgIC8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbiAgICAgICAgICAgIC8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbiAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuICAgICAgICAgICAgLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4gICAgICAgICAgICAvKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4gICAgICAgICAgICAvKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbiAgICAgICAgICAgIC8qIGFzIGlzLiovXG4gICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gcmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IFtudWxsLCAwbl0gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlID0gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGNvbnN0IHhzID0gYmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSBiYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbiAgICAgIC8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4gICAgICAvKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhjO1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeWM7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHhEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeCwgeGNdLFxuICAgICAgICB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB5RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3ksIHljXSxcbiAgICAgICAgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeHMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4LCB5KTtcbiAgICAgICAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgICAgICAgIC8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIHljXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICBjb21wID4gMCB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG4gICAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjIDwgeWMpIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnQsYmlnaW50XVtdfSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJVbmlvbiA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICByZXN1bHQucHVzaChbbSwgeGMgKyB5Y10pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uID0geHlpID0+IHtcbiAgLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgPD0geWMgPyB4YyA6IHljO1xuICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBjb25zdCBtYyA9IHhjIC0geWM7XG4gICAgbWMgPj0gMG4gfHwgRmFpbGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbiAgICBpZiAobWMgPj0gMW4pIHtcbiAgICAgIC8qIHRoZSB4IHdhcyBub3QgaW4geSovXG4gICAgICByZXN1bHQucHVzaChbbSwgbWNdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gYmFnSXRlck9wID0+ICh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpID0+XG4gIGJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWcgPSBtZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbiA9IG1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCA9IG1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5ID0gYmFnRW50cmllc09wID0+ICh4YmFnLCB5YmFnKSA9PlxuICBiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCwgeWJhZy5wYXlsb2FkKSk7XG5cbiAgICAgICBjb25zdCBiYWdJc1N1cGVyYmFnID0gcmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaM2PX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbiAgICAgICBjb25zdCBiYWdJc0Rpc2pvaW50ID0gcmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaM2PX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBiYWdVbmlvbiA9IGJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRozY9fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG4gICAgICAgY29uc3QgYmFnSW50ZXJzZWN0aW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBiYWdEaXNqb2ludFN1YnRyYWN0ID0gYmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdB+PGWUvAABlLwAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLFskaM2PX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBSYW5rQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0tleUNvbXBhcmlzb259IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGgga2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCB3aW5kb3dSZXNvcnQgPSAoZWxlbWVudHMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbGVtZW50cztcbiAgbGV0IGkgPSAwO1xuICBsZXQgb3B0SW5uZXJJdGVyYXRvcjtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+XG4gICAgICBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdElubmVySXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCovXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCAmJiByYW5rQ29tcGFyZSh2YWx1ZSwgZWxlbWVudHNbal0pID09PSAwKSB7XG4gICAgICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBlbGVtZW50cy5zbGljZShpLCBqKTtcbiAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBzb3J0QnlSYW5rKHNpbWlsYXJSdW4sIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbiAgICAgICAgICAgIC8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbiAgICAgICAgICAgIC8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbiAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuICAgICAgICAgICAgLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4gICAgICAgICAgICAvKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4gICAgICAgICAgICAvKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbiAgICAgICAgICAgIC8qIGFzIGlzLiovXG4gICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gcmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZSA9ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGNvbnN0IHhzID0gd2luZG93UmVzb3J0KHhlbGVtZW50cywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gd2luZG93UmVzb3J0KHllbGVtZW50cywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAvKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbiAgICAgIC8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4gICAgICAvKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IHggfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogeSB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG4gICAgICAgICAgICB2YWx1ZSA9IFtudWxsLCAwbiwgMG5dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeXMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB4cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIF95Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID09PSAwbikge1xuICAgICAgLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgaXRlckNvbXBhcmUgPSB4eWkgPT4ge1xuICBsZXQgbG9uZVkgPSBmYWxzZTtcbiAgbGV0IGxvbmVYID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA9PT0gMG4pIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xuICAgICAgbG9uZVkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbiAgICAgIGxvbmVYID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGxvbmVYICYmIGxvbmVZKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgfVxuICBpZiAobG9uZVgpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmIChsb25lWSkge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIHtcbiAgICAoIWxvbmVYICYmICFsb25lWSkgfHxcbiAgICAgIEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsIGxvbmVZXSl9YDtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlclVuaW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDBuKSB7XG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWMgPj0gMG4gfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4gICAgICAvKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuICAgICAgLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgeGMgPT09IDBuIHx8IHljID09PSAwbiB8fCBGYWlsYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuICAgIGlmICh4YyA+PSAxbikge1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHljID49IDFuIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdCA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID49IDFuIHx8IEZhaWxgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG4gICAgaWYgKHljID09PSAwbikge1xuICAgICAgLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBpdGVyT3AgPT4gKHhlbGVtZW50cywgeWVsZW1lbnRzKSA9PlxuICBpdGVyT3AobWVyZ2UoeGVsZW1lbnRzLCB5ZWxlbWVudHMpKTtcblxuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNTdXBlcnNldCA9IG1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaM2PX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRozY9fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBlbGVtZW50c0NvbXBhcmUgPSBtZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjNj19vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzVW5pb24gPSBtZXJnZWlmeShpdGVyVW5pb24pOyRozY9fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9IG1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG4gICAgICAgY29uc3QgZWxlbWVudHNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaM2PX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9IG1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeSA9IGVsZW1lbnRzT3AgPT4gKHhzZXQsIHlzZXQpID0+XG4gIGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLCB5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBtYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKSk7XG5cbiAgICAgICBjb25zdCBzZXRJc1N1cGVyc2V0ID0gcmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjNj19vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG4gICAgICAgY29uc3Qgc2V0SXNEaXNqb2ludCA9IHJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRozY9fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IHNldFVuaW9uID0gc2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRozY9fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG4gICAgICAgY29uc3Qgc2V0RGlzam9pbnRVbmlvbiA9IHNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRozY9fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IHNldEludGVyc2VjdGlvbiA9IHNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjNj19vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50U3VidHJhY3QgPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXRpaQisvAAArLwAANgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyJdLCJleHBvcnRzIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxBcmdHdWFyZExpc3RTaGFwZSxBd2FpdEFyZ0d1YXJkU2hhcGUsSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsSW50ZXJmYWNlR3VhcmRTaGFwZSxNLE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLE1ldGhvZEd1YXJkU2hhcGUsUmF3R3VhcmRTaGFwZSxTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxTeW5jVmFsdWVHdWFyZFNoYXBlLGFzc2VydEF3YWl0QXJnR3VhcmQsbWF0Y2hlcyxtdXN0TWF0Y2gsZ2V0Q29weU1hcEtleXMsbWFrZUNvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIkFyZ0d1YXJkTGlzdFNoYXBlXCIsWyRozY9fYSA9PiAoQXJnR3VhcmRMaXN0U2hhcGUgPSAkaM2PX2EpXV0sW1wiQXdhaXRBcmdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoQXdhaXRBcmdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW50ZXJmYWNlR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGVcIixbJGjNj19hID0+IChNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9ICRozY9fYSldXSxbXCJNZXRob2RHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJSYXdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoUmF3R3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIlN5bmNWYWx1ZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcImFzc2VydEF3YWl0QXJnR3VhcmRcIixbJGjNj19hID0+IChhc3NlcnRBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImdldENvcHlNYXBLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0F3YWl0QXJnR3VhcmQsIEF3YWl0QXJnR3VhcmRQYXlsb2FkLCBJbnRlcmZhY2VHdWFyZCwgSW50ZXJmYWNlR3VhcmRQYXlsb2FkLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRQYXlsb2FkfSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBUaGUgZ2V0Kkd1YXJkUGF5bG9hZCBmdW5jdGlvbnMgZXhpc3QgdG8gYWRhcHQgdG8gdGhlIHdvcmxkcyBib3RoKi9cbi8qIGJlZm9yZSBhbmQgYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiAuIFdoZW4qL1xuLyogZ2l2ZW4gc29tZXRoaW5nIHRoYXQgd291bGQgYmUgdGhlIGV4cGVjdGVkIGd1YXJkIGluIGVpdGhlciB3b3JsZCwqL1xuLyogaXQgcmV0dXJucyBhICpHdWFyZFBheWxvYWQgdGhhdCBpcyB2YWxpZCBpbiB0aGUgY3VycmVudCB3b3JsZC4gVGh1cyovXG4vKiBpdCBoZWxwcyBuZXcgY29uc3VtZXJzIG9mIHRoZXNlIGd1YXJkcyBjb3BlIHdpdGggb2xkIGNvZGUgdGhhdCovXG4vKiB3b3VsZCBjb25zdHJ1Y3QgYW5kIHNlbmQgdGhlc2UgZ3VhcmRzLiovXG5cbi8qIEJlY2F1c2UgdGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgbGVnYWN5IGFkYXB0YXRpb24gaXMgaW4gQGVuZG8vZXhvKi9cbi8qIG9yIHBhY2thZ2VzIHRoYXQgZGVwZW5kIG9uIGl0LCB0aGUgdGVzdHMgZm9yIHRoaXMgbGVnYWN5IGFkYXB0YXRpb24qL1xuLyogYXJlIGZvdW5kIGluIHRoZSBAZW5kby9leG8gYHRlc3QtbGVnYWN5LWd1YXJkLXRvbGVyYW5jZS5qc2AuKi9cblxuLyogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSwqL1xuLyogYW5kIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEqL1xuLyogTGVnYWN5UmF3R3VhcmRTaGFwZSwgYmVjYXVzZSByYXcgZ3VhcmRzIHdlcmUgaW50cm9kdWNlZCBhdCovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODMxICwgd2hpY2ggd2FzIG1lcmdlZCB3ZWxsIGFmdGVyKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgLiBUaHVzLCB0aGVyZSB3YXMgbmV2ZXIgYSovXG4vKiBga2xhc3M6YCBmb3JtIG9mIHRoZSByYXcgZ3VhcmQuKi9cblxuLyogVE9ETyBBdCBzdWNoIGEgdGltZSB0aGF0IHdlIGRlY2lkZSB3ZSBubyBsb25nZXIgbmVlZCB0byBzdXBwb3J0IGNvZGUqL1xuLyogcHJlY2VkaW5nIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgb3IgZ3VhcmQgZGF0YSovXG4vKiBnZW5lcmF0ZWQgYnkgdGhhdCBjb2RlLCBhbGwgdGhlIGFkYXB0YXRpb24gY29tcGxleGl0eSBpbiB0aGlzIGZpbGUqL1xuLyogc2hvdWxkIGJlIGRlbGV0ZWQuKi9cblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUgPSBoYXJkZW4oe1xuICBrbGFzczogJ2F3YWl0QXJnJyxcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGVjaG5pY2FsbHksIHRvbGVyYXRpbmcgdGhlIG9sZCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGVcbiAqIGlzIGFuIGV4cGxvaXRhYmxlIGJ1ZywgaW4gdGhhdCBhIHJlY29yZCB0aGF0IG1hdGNoZXMgdGhpc1xuICogc2hhcGUgaXMgYWxzbyBhIHZhbGlkIHBhcmFtZXRlciBwYXR0ZXJuIHRoYXQgc2hvdWxkIGFsbG93XG4gKiBhbiBhcmd1bWVudCB0aGF0IG1hdGNoZXMgdGhhdCBwYXR0ZXJuLCBpLmUuLCBhIGNvcHlSZWNvcmQgYXJndW1lbnQgdGhhdFxuICogYXQgbGVhc3QgY29udGFpbnMgYSBga2xhc3M6ICdhd2FpdEFyZ0d1YXJkJ2AgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtBd2FpdEFyZ0d1YXJkfSBhd2FpdEFyZ0d1YXJkXG4gKiBAcmV0dXJucyB7QXdhaXRBcmdHdWFyZFBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCA9IGF3YWl0QXJnR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhhd2FpdEFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBjb25zdCB7IGtsYXNzOiBfLCAuLi5wYXlsb2FkIH0gPSBhd2FpdEFyZ0d1YXJkO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbiAgYXNzZXJ0QXdhaXRBcmdHdWFyZChhd2FpdEFyZ0d1YXJkKTtcbiAgcmV0dXJuIGF3YWl0QXJnR3VhcmQucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCk7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ3N5bmMnLFxuICAgIGFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gICAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gICAgcmVzdEFyZ0d1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEFyZ0d1YXJkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBcmdHdWFyZFNoYXBlID0gTS5vcihcbiAgUmF3R3VhcmRTaGFwZSxcbiAgQXdhaXRBcmdHdWFyZFNoYXBlLFxuICBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIE0ucGF0dGVybigpLFxuKTtcbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBcmdHdWFyZExpc3RTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKExlZ2FjeUFyZ0d1YXJkU2hhcGUpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgICBhcmdHdWFyZHM6IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUgPSBNLm9yKFxuICBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSxcbiAgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlLFxuKTtcblxuY29uc3QgYWRhcHRMZWdhY3lBcmdHdWFyZCA9IGFyZ0d1YXJkID0+XG4gIG1hdGNoZXMoYXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSlcbiAgICA/IE0uYXdhaXQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkKVxuICAgIDogYXJnR3VhcmQ7XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBVbmxpa2UgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLCB0b2xlcmF0aW5nIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGVcbiAqIGRvZXMgbm90IHNlZW0gbGlrZSBhIGN1cnJlbnRseSBleHBsb2l0YWJsZSBidWcsIGJlY2F1c2UgdGhlcmUgaXMgbm90XG4gKiBjdXJyZW50bHkgYW55IGNvbnRleHQgd2hlcmUgZWl0aGVyIGEgbWV0aG9kR3VhcmQgb3IgYSBjb3B5UmVjb3JkIHdvdWxkXG4gKiBib3RoIGJlIG1lYW5pbmdmdWwuXG4gKlxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZFBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2RHdWFyZFBheWxvYWQgPSBtZXRob2RHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKG1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZFNoYXBlKSkge1xuICAgIHJldHVybiBtZXRob2RHdWFyZC5wYXlsb2FkO1xuICB9XG4gIG11c3RNYXRjaChtZXRob2RHdWFyZCwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSwgJ2xlZ2FjeU1ldGhvZEd1YXJkJyk7XG4gIGNvbnN0IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGtsYXNzOiBfLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgY2FsbEtpbmQsXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICByZXR1cm5HdWFyZCxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBsZXQge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgYXJnR3VhcmRzLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gIH0gPSBtZXRob2RHdWFyZDtcbiAgaWYgKGNhbGxLaW5kID09PSAnYXN5bmMnKSB7XG4gICAgYXJnR3VhcmRzID0gYXJnR3VhcmRzLm1hcChhZGFwdExlZ2FjeUFyZ0d1YXJkKTtcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyAmJiBvcHRpb25hbEFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgY2FsbEtpbmQsXG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgICByZXR1cm5HdWFyZCxcbiAgfSk7XG4gIC8qIGVuc3VyZSB0aGUgYWRhcHRhdGlvbiBzdWNjZWVkZWQuKi9cbiAgbXVzdE1hdGNoKHBheWxvYWQsIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLCAnaW50ZXJuYWxNZXRob2RHdWFyZEFkYXB0b3InKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRNZXRob2RHdWFyZFBheWxvYWQoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VOYW1lOiBNLnN0cmluZygpLFxuICAgIG1ldGhvZEd1YXJkczogTS5yZWNvcmRPZihcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgICBNLm9yKE1ldGhvZEd1YXJkU2hhcGUsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpLFxuICAgICksXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0R3VhcmRzOiBNLm9yKE0udW5kZWZpbmVkKCksICdwYXNzYWJsZScsICdyYXcnKSxcbiAgICBzbG9wcHk6IE0uYm9vbGVhbigpLFxuICAgIC8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gYWNjb21tb2RhdGUgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSBpbiovXG4gICAgLyogdGhpcyBwb3NpdGlvbiwgc2luY2UgYHN5bWJvbE1ldGhvZEd1YXJkcyBoYXBwZW5lZCovXG4gICAgLyogYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiovXG4gICAgc3ltYm9sTWV0aG9kR3VhcmRzOiBNLm1hcE9mKE0uc3ltYm9sKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuKTtcblxuY29uc3QgYWRhcHRNZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbEtpbmQsXG4gICAgICBhcmdHdWFyZHMsXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgICAgcmVzdEFyZ0d1YXJkID0gTS5hbnkoKSxcbiAgICAgIHJldHVybkd1YXJkLFxuICAgIH0gPSBnZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuICAgIGNvbnN0IG1DYWxsID0gY2FsbEtpbmQgPT09ICdzeW5jJyA/IE0uY2FsbCA6IE0uY2FsbFdoZW47XG4gICAgcmV0dXJuIG1DYWxsKC4uLmFyZ0d1YXJkcylcbiAgICAgIC5vcHRpb25hbCguLi5vcHRpb25hbEFyZ0d1YXJkcylcbiAgICAgIC5yZXN0KHJlc3RBcmdHdWFyZClcbiAgICAgIC5yZXR1cm5zKHJldHVybkd1YXJkKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kR3VhcmQ7XG59O1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIsXG4gKiB0b2xlcmF0aW5nIGJvdGggdGhlIGxlZ2FjeSBhbmQgY3VycmVudCBndWFyZCBzaGFwZXMuXG4gKlxuICogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgdG9sZXJhdGluZyBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlXG4gKiBkb2VzIG5vdCBzZWVtIGxpa2UgYSBjdXJyZW50bHkgZXhwbG9pdGFibGUgYnVnLCBiZWNhdXNlIHRoZXJlIGlzIG5vdFxuICogY3VycmVudGx5IGFueSBjb250ZXh0IHdoZXJlIGVpdGhlciBhbiBpbnRlcmZhY2VHdWFyZCBvciBhIGNvcHlSZWNvcmQgd291bGRcbiAqIGJvdGggYmUgbWVhbmluZ2Z1bC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD59IFtUPVJlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD5dXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPFQ+fSBpbnRlcmZhY2VHdWFyZFxuICogQHJldHVybnMge0ludGVyZmFjZUd1YXJkUGF5bG9hZDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9IGludGVyZmFjZUd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMoaW50ZXJmYWNlR3VhcmQsIEludGVyZmFjZUd1YXJkU2hhcGUpKSB7XG4gICAgcmV0dXJuIGludGVyZmFjZUd1YXJkLnBheWxvYWQ7XG4gIH1cbiAgbXVzdE1hdGNoKGludGVyZmFjZUd1YXJkLCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlLCAnbGVnYWN5SW50ZXJmYWNlR3VhcmQnKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gIGxldCB7IGtsYXNzOiBfLCBpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIC4uLnJlc3QgfSA9IGludGVyZmFjZUd1YXJkO1xuICBtZXRob2RHdWFyZHMgPSBvYmplY3RNYXAobWV0aG9kR3VhcmRzLCBhZGFwdE1ldGhvZEd1YXJkKTtcbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgaW50ZXJmYWNlTmFtZSxcbiAgICBtZXRob2RHdWFyZHMsXG4gICAgLi4ucmVzdCxcbiAgfSk7XG4gIG11c3RNYXRjaChcbiAgICBwYXlsb2FkLFxuICAgIEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxuICAgICdpbnRlcm5hbEludGVyZmFjZUd1YXJkQWRhcHRvcicsXG4gICk7XG4gIHJldHVybiBwYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcblxuY29uc3QgZW1wdHlDb3B5TWFwID0gbWFrZUNvcHlNYXAoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcmV0dXJucyB7KHN0cmluZyB8IHN5bWJvbClbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU1ldGhvZEtleXMgPSBpbnRlcmZhY2VHdWFyZCA9PiB7XG4gIGNvbnN0IHsgbWV0aG9kR3VhcmRzLCBzeW1ib2xNZXRob2RHdWFyZHMgPSBlbXB0eUNvcHlNYXAgfSA9XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbiAgLyoqIEB0eXBlIHsoc3RyaW5nIHwgc3ltYm9sKVtdfSAqL1xuICAvKiBUT0RPIGF0LXRzLWV4cGVjdC1lcnJvciB3b3JrcyBsb2NhbGx5IGJ1dCBub3QgZnJvbSBAZW5kby9leG8qL1xuICAvKiBAdHMtaWdub3JlIGluZmVyZW5jZSBpcyB0b28gd2VhayB0byBzZWUgdGhpcyBpcyBvayovXG4gIHJldHVybiBoYXJkZW4oW1xuICAgIC4uLlJlZmxlY3Qub3duS2V5cyhtZXRob2RHdWFyZHMpLFxuICAgIC4uLmdldENvcHlNYXBLZXlzKHN5bWJvbE1ldGhvZEd1YXJkcyksXG4gIF0pO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIl0sImdldE1ldGhvZEd1YXJkUGF5bG9hZCI6WyJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIjpbImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIjpbImdldEludGVyZmFjZU1ldGhvZEtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZqTue74yAQC+MgEANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJBcmdHdWFyZExpc3RTaGFwZSIsIkF3YWl0QXJnR3VhcmRTaGFwZSIsIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRTaGFwZSIsIk0iLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSIsIk1ldGhvZEd1YXJkU2hhcGUiLCJSYXdHdWFyZFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiLCJTeW5jVmFsdWVHdWFyZFNoYXBlIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIiwiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UmF3R3VhcmQiLCJjaGVja01hdGNoZXMiLCJjb250YWluZXJIYXNTcGxpdCIsImRlZmF1bHRMaW1pdHMiLCJnZXRSYW5rQ292ZXIiLCJpc0F3YWl0QXJnR3VhcmQiLCJpc1BhdHRlcm4iLCJpc1Jhd0d1YXJkIiwia2luZE9mIiwibWF0Y2hlcyIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYixYLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxhc3NlcnRDaGVja2VyLEZhcixnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHFwLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWcsZ2V0Q29weU1hcEVudHJ5QXJyYXksbWFrZUNvcHlNYXAsbWFrZUNvcHlTZXQsbWFrZUNvcHlCYWcsZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanNcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLFskaM2PX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIixbJGjNj19hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsWyRozY9fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaM2PX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLFskaM2PX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dLFtcInFwXCIsWyRozY9fYSA9PiAocXAgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcImtleUdUXCIsWyRozY9fYSA9PiAoa2V5R1QgPSAkaM2PX2EpXV0sW1wia2V5R1RFXCIsWyRozY9fYSA9PiAoa2V5R1RFID0gJGjNj19hKV1dLFtcImtleUxUXCIsWyRozY9fYSA9PiAoa2V5TFQgPSAkaM2PX2EpXV0sW1wia2V5TFRFXCIsWyRozY9fYSA9PiAoa2V5TFRFID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImNoZWNrS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tLZXkgPSAkaM2PX2EpXV0sW1wiaXNLZXlcIixbJGjNj19hID0+IChpc0tleSA9ICRozY9fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLFskaM2PX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weVNldFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlNYXBcIixbJGjNj19hID0+IChjaGVja0NvcHlNYXAgPSAkaM2PX2EpXV0sW1wiY29weU1hcEtleVNldFwiLFskaM2PX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllc1wiLFskaM2PX2EgPT4gKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXIsIENvcHlBcnJheSwgQ29weVJlY29yZCwgQ29weVRhZ2dlZCwgUGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDb3B5U2V0LCBDb3B5QmFnLCBBcmdHdWFyZCwgQXdhaXRBcmdHdWFyZCwgQ2hlY2tQYXR0ZXJuLCBHZXRSYW5rQ292ZXIsIEludGVyZmFjZUd1YXJkLCBNYXRjaGVyTmFtZXNwYWNlLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRNYWtlciwgUGF0dGVybiwgUmF3R3VhcmQsIFN5bmNWYWx1ZUd1YXJkLCBLaW5kLCBMaW1pdHMsIEFsbExpbWl0cywgS2V5LCBEZWZhdWx0R3VhcmRUeXBlfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge01hdGNoSGVscGVyLCBQYXR0ZXJuS2l0fSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgZW50cmllcywgdmFsdWVzLCBoYXNPd24gfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqIEB0eXBlIHtXZWFrU2V0PFBhdHRlcm4+fSAqL1xuY29uc3QgcGF0dGVybk1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuICAgICAgIGNvbnN0IGRlZmF1bHRMaW1pdHMgPSBoYXJkZW4oe1xuICBkZWNpbWFsRGlnaXRzTGltaXQ6IDEwMCxcbiAgc3RyaW5nTGVuZ3RoTGltaXQ6IDEwMF8wMDAsXG4gIHN5bWJvbE5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBudW1Qcm9wZXJ0aWVzTGltaXQ6IDgwLFxuICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBhcnJheUxlbmd0aExpbWl0OiAxMF8wMDAsXG4gIGJ5dGVMZW5ndGhMaW1pdDogMTAwXzAwMCxcbiAgbnVtU2V0RWxlbWVudHNMaW1pdDogMTBfMDAwLFxuICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bU1hcEVudHJpZXNMaW1pdDogNTAwMCxcbn0pO1xuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaM2PX29uY2UuZGVmYXVsdExpbWl0cyhkZWZhdWx0TGltaXRzKTtcbmNvbnN0IGxpbWl0ID0gKGxpbWl0cyA9IHt9KSA9PlxuICAvKiogQHR5cGUge0FsbExpbWl0c30gKi8gKGhhcmRlbih7IF9fcHJvdG9fXzogZGVmYXVsdExpbWl0cywgLi4ubGltaXRzIH0pKTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQgPSAoXG4gIHBheWxvYWQsXG4gIG1haW5QYXlsb2FkU2hhcGUsXG4gIGNoZWNrLFxuICBsYWJlbCxcbikgPT4ge1xuICBhc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiAgfVxuXG4gIC8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuICAvKiBjb25zdCBwYXlsb2FkTGltaXRTaGFwZSA9IGhhcmRlbigqL1xuICAvKiBNLnNwbGl0KCovXG4gIC8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbiAgLyogTS5wYXJ0aWFsKGhhcmRlbihbTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLm51bWJlcigpKV0pLCBoYXJkZW4oW10pKSwqL1xuICAvKiApLCovXG4gIC8qICk7Ki9cbiAgLyogcmV0dXJuIGNoZWNrTWF0Y2hlcyhwYXlsb2FkLCBwYXlsb2FkTGltaXRTaGFwZSwgY2hlY2ssIGxhYmVsKTsqL1xuXG4gIGNvbnN0IG1haW5MZW5ndGggPSBtYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbiAgaWYgKCEocGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggfHwgcGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggKyAxKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuICB9XG4gIGNvbnN0IGxpbWl0cyA9IHBheWxvYWRbbWFpbkxlbmd0aF07XG4gIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBtYWluTGVuZ3RoKSk7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGlmICghY2hlY2tNYXRjaGVzKHBheWxvYWQsIG1haW5QYXlsb2FkU2hhcGUsIGNoZWNrLCBsYWJlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxpbWl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAocGFzc1N0eWxlT2YobGltaXRzKSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpICYmXG4gICAgZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgcGFzc1N0eWxlT2YodmFsdWUpID09PSAnbnVtYmVyJyB8fFxuICAgICAgICBjaGVjayhmYWxzZSwgWGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHBhcmFtIHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCA9IChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaykgPT4ge1xuICBpZiAoXG4gICAgTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkgKyAxIDw9XG4gICAgZGVjaW1hbERpZ2l0c0xpbWl0XG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBjaGVjayhcbiAgICBmYWxzZSxcbiAgICBYYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHJldHVybnMge1BhdHRlcm5LaXR9XG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0ID0gKCkgPT4ge1xuICAvKipcbiAqIElmIHRoaXMgaXMgYSByZWNvZ25pemVkIG1hdGNoIHRhZywgcmV0dXJuIHRoZSBNYXRjaEhlbHBlci5cbiAqIE90aGVyd2lzZSByZXN1bHQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtNYXRjaEhlbHBlciB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBtYXliZU1hdGNoSGVscGVyID0gdGFnID0+XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBIZWxwZXJzQnlNYXRjaFRhZ1t0YWddO1xuXG4gIC8qKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIGFic2VuY2UgYnkgcmV0dXJuaW5nIGB1bmRlZmluZWRgLFxuICogZXZlbiB0aG91Z2ggYHVuZGVmaW5lZGAgaXMgYSB2YWxpZCBwYXR0ZXJuLiBUbyBldmFkZSB0aGlzIGNvbmZ1c2lvbixcbiAqIHRvIHJlZ2lzdGVyIGEgcGF5bG9hZCBzaGFwZSB3aXRoIHRoYXQgbWVhbmluZywgdXNlIGBNTS51bmRlZmluZWQoKWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge1BhdHRlcm4gfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVQYXlsb2FkU2hhcGUgPSB0YWcgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIEd1YXJkUGF5bG9hZFNoYXBlc1t0YWddO1xuXG4gIC8qKiBAdHlwZSB7TWFwPEtpbmQsIHVua25vd24+fSAqL1xuICBjb25zdCBzaW5nbGV0b25LaW5kcyA9IG5ldyBNYXAoW1xuICAgIFsnbnVsbCcsIG51bGxdLFxuICAgIFsndW5kZWZpbmVkJywgdW5kZWZpbmVkXSxcbiAgXSk7XG5cbiAgLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxDb3B5VGFnZ2VkLCBLaW5kPn1cbiAqIE9ubHkgZm9yIHRhZ2dlZCByZWNvcmRzIG9mIHJlY29nbml6ZWQga2luZHMgd2hvc2Ugc3RvcmUtbGV2ZWwgaW52YXJpYW50c1xuICogaGF2ZSBhbHJlYWR5IGJlZW4gY2hlY2tlZC5cbiAqL1xuICBjb25zdCB0YWdNZW1vID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQgdGFncywgYW5kIG9ubHkgaWYgdGhlIHRhZ2dlZFxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHRhZ2dlZFxuICogQHBhcmFtIHtLaW5kfSB0YWdcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrVGFnZ2VkID0gKHRhZ2dlZCwgdGFnLCBjaGVjaykgPT4ge1xuICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbiAgICAgIC8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG4gICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsIGNoZWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGF5bG9hZFNoYXBlID0gbWF5YmVQYXlsb2FkU2hhcGUodGFnKTtcbiAgICAgIGlmIChwYXlsb2FkU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKHRhZ2dlZC5wYXlsb2FkLCBwYXlsb2FkU2hhcGUsIGNoZWNrLCB0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weVNldCh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX06ICR7dGFnZ2VkfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogUmV0dXJucyBvbmx5IGEgcmVjb2duaXplZCBraW5kLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW4gcGFzc2VzIHRoZVxuICogaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqIE90aGVyd2lzZSwgYGNoZWNrKGZhbHNlLCAuLi4pYCBhbmQgcmV0dXJucyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3Qga2luZE9mID0gKHNwZWNpbWVuLCBjaGVjayA9IGlkZW50Q2hlY2tlcikgPT4ge1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICBpZiAocGFzc1N0eWxlICE9PSAndGFnZ2VkJykge1xuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9XG4gICAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgd2VsbCBmb3JtZWQqL1xuICAgIC8qIGFzIGEgdGFnZ2VkIHJlY29yZCwgd2hpY2ggaXMgZGVmaW5lZCBhdCB0aGUgbWFyc2hhbCBsZXZlbCBvZiBhYnN0cmFjdGlvbiwqL1xuICAgIC8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbiAgICBpZiAodGFnTWVtby5oYXMoc3BlY2ltZW4pKSB7XG4gICAgICByZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBnZXRUYWcoc3BlY2ltZW4pO1xuICAgIGlmIChjaGVja1RhZ2dlZChzcGVjaW1lbiwgdGFnLCBjaGVjaykpIHtcbiAgICAgIHRhZ01lbW8uc2V0KHNwZWNpbWVuLCB0YWcpO1xuICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgaWYgKGNoZWNrICE9PSBpZGVudENoZWNrZXIpIHtcbiAgICAgIGNoZWNrKGZhbHNlLCBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICBoYXJkZW4oa2luZE9mKTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQga2luZHMsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lblxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja0tpbmQgPSAoc3BlY2ltZW4sIGtpbmQsIGNoZWNrKSA9PiB7XG4gICAgLyogY2hlY2sgbnVsbCBhbmQgdW5kZWZpbmVkIGFzIEtleXMqL1xuICAgIGlmIChzaW5nbGV0b25LaW5kcy5oYXMoa2luZCkpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHNpbmdsZXRvbktpbmRzLmdldChraW5kKSwgY2hlY2spO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWxLaW5kID0ga2luZE9mKHNwZWNpbWVuLCBjaGVjayk7XG4gICAgaWYgKGtpbmQgPT09IHJlYWxLaW5kKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoZWNrICE9PSBpZGVudENoZWNrZXIpIHtcbiAgICAgIC8qIGBraW5kYCBhbmQgYHJlYWxLaW5kYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMqL1xuICAgICAgLyogYmVjYXVzZSB0aGV5IGFyZSBkcmF3biBmcm9tIHRoZSBlbnVtZXJhdGVkIGNvbGxlY3Rpb24gb2Yga25vd24gS2luZHMuKi9cbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7YihyZWFsS2luZCl9ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhICR7YihraW5kKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tpbmR9IGtpbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzS2luZCA9IChzcGVjaW1lbiwga2luZCkgPT4gY2hlY2tLaW5kKHNwZWNpbWVuLCBraW5kLCBpZGVudENoZWNrZXIpO1xuXG4gIC8qKlxuICogQ2hlY2tzIGlmIGEgcGF0dGVybiBtYXRjaGVzIG9ubHkgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzVW5kZWZpbmVkUGF0dCA9IHBhdHQgPT5cbiAgICBwYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAoaXNLaW5kKHBhdHQsICdtYXRjaDpraW5kJykgJiYgcGF0dC5wYXlsb2FkID09PSAndW5kZWZpbmVkJyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2V5fSBrZXlBc1BhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrQXNLZXlQYXR0ID0gKHNwZWNpbWVuLCBrZXlBc1BhdHRlcm4sIGNoZWNrKSA9PiB7XG4gICAgaWYgKGlzS2V5KHNwZWNpbWVuKSAmJiBrZXlFUShzcGVjaW1lbiwga2V5QXNQYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAvKiBXaGVuIHRoZSBtaXNtYXRjaCBvY2N1cnMgYWdhaW5zdCBhIGtleSB1c2VkIGFzIGEgcGF0dGVybiwqL1xuICAgICAgLyogdGhlIHBhdHRlcm4gc2hvdWxkIHN0aWxsIGJlIHJlZGFjdGVkLiovXG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApXG4gICAgKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7Q2hlY2tQYXR0ZXJufSAqL1xuICBjb25zdCBjaGVja1BhdHRlcm4gPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIC8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4gICAgICAvKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbiAgICAgIC8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4gICAgICAvKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocGF0dGVybk1lbW8uaGFzKHBhdHQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBjb25zdCByZXN1bHQgPSBjaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LCBjaGVjayk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcGF0dGVybk1lbW8uYWRkKHBhdHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrUGF0dGVybkludGVybmFsID0gKHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLyogUHVycG9zZWx5IHBhcmFsbGVscyBjaGVja0tleS4gVE9ETyByZXVzZSBtb3JlIGxvZ2ljIGJldHdlZW4gdGhlbS4qL1xuICAgIC8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbiAgICAvKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbiAgICBjb25zdCBjaGVja0l0ID0gY2hpbGQgPT4gY2hlY2tQYXR0ZXJuKGNoaWxkLCBjaGVjayk7XG5cbiAgICBjb25zdCBraW5kID0ga2luZE9mKHBhdHQsIGNoZWNrKTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbiAgICAgICAgLyogcGF0dGVybnMqL1xuICAgICAgICByZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbiAgICAgICAgLyogcGF0dGVybnMqL1xuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIC8qIEEgY29weU1hcCdzIGtleXMgYXJlIGtleXMgYW5kIHRoZXJlZm9yZSBhbHJlYWR5IGtub3duIHRvIGJlKi9cbiAgICAgICAgLyogcGF0dGVybnMuKi9cbiAgICAgICAgLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xuICAgICAgICByZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzUGF0dGVybiA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuICBjb25zdCBhc3NlcnRQYXR0ZXJuID0gcGF0dCA9PiB7XG4gICAgY2hlY2tQYXR0ZXJuKHBhdHQsIGFzc2VydENoZWNrZXIpO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja01hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHRlcm4sIGNoZWNrLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIGFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCwgW3NwZWNpbWVuLCBwYXR0ZXJuLCBjaGVja10sIGxhYmVsKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbCA9IChzcGVjaW1lbiwgcGF0dCwgY2hlY2spID0+IHtcbiAgICAvKiBXb3J0aCBiZWluZyBhIGJpdCB2ZXJib3NlIGFuZCByZXBldGl0aXZlIGluIG9yZGVyIHRvIG9wdGltaXplKi9cbiAgICBjb25zdCBwYXR0ZXJuS2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgY29uc3Qgc3BlY2ltZW5LaW5kID0ga2luZE9mKHNwZWNpbWVuKTsgLyogbWF5IGJlIHVuZGVmaW5lZCovXG4gICAgc3dpdGNoIChwYXR0ZXJuS2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgcGF0dGVybiBleHBlY3RlZDogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gRmFpbGBwcm9taXNlcyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBGYWlsYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICAgIGNhc2UgJ2NvcHlTZXQnOlxuICAgICAgY2FzZSAnY29weUJhZyc6XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIC8qIFRoZXNlIGtpbmRzIGFyZSBuZWNlc3NhcmlseSBrZXlzKi9cbiAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuICAgICAgICAgIC8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0O1xuICAgICAgICBpZiAoc3BlY2ltZW4ubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeSgocCwgaSkgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuW2ldLCBwLCBjaGVjaywgaSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5UmVjb3JkJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLyogVE9ETyBEZXRlY3QgYW5kIGFjY3VtdWxhdGUgZGlmZmVyZW5jZSBpbiBvbmUgcGFzcy4qL1xuICAgICAgICAvKiBSYXRoZXIgdGhhbiB1c2luZyB0d28gY2FsbHMgdG8gYGxpc3REaWZmZXJlbmNlYCB0byBkZXRlY3QgYW5kKi9cbiAgICAgICAgLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbiAgICAgICAgLyogaW4gc29ydGVkIG9yZGVyLCB3ZSBzaG91bGQgaW5zdGVhZCB1c2UgYW4gYWxnb3JpdGhtIGxpa2UqL1xuICAgICAgICAvKiBgaXRlckRpc2pvaW50VW5pb25gIGZyb20gbWVyZ2Utc29ydC1vcGVyYXRvcnMuanMqL1xuICAgICAgICBjb25zdCBzcGVjaW1lbk5hbWVzID0gcmVjb3JkTmFtZXMoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCBwYXR0TmFtZXMgPSByZWNvcmROYW1lcyhwYXR0KTtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IGxpc3REaWZmZXJlbmNlKHBhdHROYW1lcywgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBoYXZlIG1pc3NpbmcgcHJvcGVydGllcyAke3EobWlzc2luZyl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuZXhwZWN0ZWQgPSBsaXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLCBwYXR0TmFtZXMpO1xuICAgICAgICBpZiAodW5leHBlY3RlZC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG4gICAgICAgICAgICAgIHVuZXhwZWN0ZWQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IHJlY29yZFZhbHVlcyhzcGVjaW1lbiwgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocGF0dCwgcGF0dE5hbWVzKTtcbiAgICAgICAgcmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsIGkpID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLCBwYXR0VmFsdWVzW2ldLCBjaGVjaywgbGFiZWwpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5TWFwJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5TWFwIHRvIG1hdGNoIGEgY29weU1hcCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbiAgICAgICAgY29uc3QgcGF0dEtleVNldCA9IGNvcHlNYXBLZXlTZXQocGF0dCk7XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuS2V5U2V0ID0gY29weU1hcEtleVNldChzcGVjaW1lbik7XG4gICAgICAgIGlmICghY2hlY2tNYXRjaGVzKHNwZWNpbWVuS2V5U2V0LCBwYXR0S2V5U2V0LCBjaGVjaykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyBhZnRlciBhcHBseWluZyBhIHNoYXJlZCB0b3RhbCBvcmRlci4qL1xuICAgICAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBhbnRpUmFua09yZGVyIHNvcnRpbmcgb2YgZWFjaCBtYXAncyovXG4gICAgICAgIC8qIGVudHJpZXMgaXMgYSBwcmVvcmRlciB0aGF0IGFkbWl0cyB0aWVzLiovXG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZW50cnlQYWlycyA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgICAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCBwYXR0VmFsdWUsIHNwZWNpbWVuVmFsdWVdIG9mIGVudHJ5UGFpcnMpIHtcbiAgICAgICAgICBwYXR0VmFsdWVzLnB1c2gocGF0dFZhbHVlKTtcbiAgICAgICAgICBzcGVjaW1lblZhbHVlcy5wdXNoKHNwZWNpbWVuVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXMoaGFyZGVuKHNwZWNpbWVuVmFsdWVzKSwgaGFyZGVuKHBhdHRWYWx1ZXMpLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG4gICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQucGF5bG9hZCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgbWF0Y2hlcyA9IChzcGVjaW1lbiwgcGF0dCkgPT5cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKi9cbiAgY29uc3QgbXVzdE1hdGNoID0gKHNwZWNpbWVuLCBwYXR0LCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGxldCBpbm5lckVycm9yO1xuICAgIHRyeSB7XG4gICAgICBpZiAoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICBpbm5lckVycm9yID0gZXI7XG4gICAgfVxuICAgIC8qIHNob3VsZCBvbmx5IHRocm93Ki9cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGFzc2VydENoZWNrZXIsIGxhYmVsKTtcbiAgICBjb25zdCBvdXRlckVycm9yID0gbWFrZUVycm9yKFxuICAgICAgWGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3FwKHBhdHQpfWAsXG4gICAgKTtcbiAgICBpZiAoaW5uZXJFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyb3IsIFhgY2F1c2VkIGJ5ICR7aW5uZXJFcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgb3V0ZXJFcnJvcjtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBnZXRSYW5rQ292ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7R2V0UmFua0NvdmVyfSAqL1xuICBjb25zdCBnZXRSYW5rQ292ZXIgPSAocGF0dCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQYXNzYWJsZShwYXR0KTtcbiAgICAgIGlmIChlbmNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGF0dCk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuICAgICAgICAvKiovXG4gICAgICAgIC8qIGNvbnN0IHJhbmtDb3ZlcnMgPSBwYXR0Lm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpOyovXG4gICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgIC8qIHJhbmtDb3ZlcnMubWFwKChbbGVmdCwgX3JpZ2h0XSkgPT4gbGVmdCksKi9cbiAgICAgICAgLyogcmFua0NvdmVycy5tYXAoKFtfbGVmdCwgcmlnaHRdKSA9PiByaWdodCksKi9cbiAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuICAgICAgICAvKiovXG4gICAgICAgIC8qIGNvbnN0IHBhdHRLZXlzID0gb3duS2V5cyhwYXR0KTsqL1xuICAgICAgICAvKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuICAgICAgICAvKiBjb25zdCBbbGVmdEVudHJpZXNMaW1pdCwgcmlnaHRFbnRyaWVzTGltaXRdID0qL1xuICAgICAgICAvKiBnZXRSYW5rQ292ZXIocGF0dEVudHJpZXMpOyovXG4gICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgIC8qIGZyb21VbmlxdWVFbnRyaWVzKGxlZnRFbnRyaWVzTGltaXQpLCovXG4gICAgICAgIC8qIGZyb21VbmlxdWVFbnRyaWVzKHJpZ2h0RW50cmllc0xpbWl0KSwqL1xuICAgICAgICAvKiBdKTsqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHBhdHQpO1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbiAgICAgICAgICAvKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLCBlbmNvZGVQYXNzYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4gICAgICAgICAgICAvKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbiAgICAgICAgICAgIC8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbiAgICAgICAgICAgIC8qIGBgYGpzKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuICAgICAgICAgICAgLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuICAgICAgICAgICAgLyogYGBgKi9cbiAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgIC8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZFswXSwqL1xuICAgICAgICAgICAgLyogKTsqL1xuICAgICAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgICAgIC8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbiAgICAgICAgICAgIC8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4gICAgICAgICAgICAvKiBdKTsqL1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4gICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAvKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbiAgICAgICAgICAgIC8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4gICAgICAgICAgICAvKiAvLyBtYXRjaCAxLXRvLTEuKi9cbiAgICAgICAgICAgIC8qIC8vKi9cbiAgICAgICAgICAgIC8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4gICAgICAgICAgICAvKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuICAgICAgICAgICAgLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuICAgICAgICAgICAgLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbiAgICAgICAgICAgIC8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuICAgICAgICAgICAgLyogLy8qL1xuICAgICAgICAgICAgLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbiAgICAgICAgICAgIC8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbiAgICAgICAgICAgIC8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuICAgICAgICAgICAgLyogLy8gdGhpcyBidWcuKi9cbiAgICAgICAgICAgIC8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZCwqL1xuICAgICAgICAgICAgLyogZW5jb2RlUGFzc2FibGUsKi9cbiAgICAgICAgICAgIC8qICk7Ki9cbiAgICAgICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgICAgICAvKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbiAgICAgICAgICAgIC8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbiAgICAgICAgICAgIC8qIF0pOyovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxQcmVmaXhdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuID0gKGFycmF5LCBwYXR0LCBjaGVjaywgbGFiZWxQcmVmaXggPSAnJykgPT4ge1xuICAgIGlmIChpc0tpbmQocGF0dCwgJ21hdGNoOmFueScpKSB7XG4gICAgICAvKiBpZiB0aGUgcGF0dGVybiBpcyBNLmFueSgpLCB3ZSBrbm93IGl0cyB0cnVlKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXkuZXZlcnkoKGVsLCBpKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKGVsLCBwYXR0LCBjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCksXG4gICAgKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQW55SGVscGVyID0gRmFyKCdtYXRjaDphbnkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKF9zcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBfY2hlY2spID0+IHRydWUsXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKG1hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIG1hdGNoZXJQYXlsb2FkID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYG1hdGNoOmFueSBwYXlsb2FkOiAke21hdGNoZXJQYXlsb2FkfSAtIE11c3QgYmUgdW5kZWZpbmVkYCksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hBbmRIZWxwZXIgPSBGYXIoJ21hdGNoOmFuZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgcmV0dXJuIHBhdHRzLmV2ZXJ5KHBhdHQgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykpO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRQYXR0cywgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IGNoZWNrSXQgPSBwYXR0ID0+IGNoZWNrUGF0dGVybihwYXR0LCBjaGVjayk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgICAgICBjaGVjayhmYWxzZSwgWGBOZWVkcyBhcnJheSBvZiBzdWItcGF0dGVybnM6ICR7cXAoYWxsZWdlZFBhdHRzKX1gKSkgJiZcbiAgICAgICAgYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChwYXR0cywgZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzKFxuICAgICAgICBjb21wYXJlUmFuayxcbiAgICAgICAgcGF0dHMubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSksXG4gICAgICApLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE9ySGVscGVyID0gRmFyKCdtYXRjaDpvciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHBhdHRzO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGAke3NwZWNpbWVufSAtIG5vIHBhdHRlcm4gZGlzanVuY3RzIHRvIG1hdGNoOiAke3FwKHBhdHRzKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLyogU3BlY2lhbCBjYXNlIGRpc2p1bmN0aW9ucyByZXByZXNlbnRpbmcgYSBzaW5nbGUgb3B0aW9uYWwgcGF0dGVybiBmb3IqL1xuICAgICAgLyogYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG4gICAgICBjb25zdCBiaW5hcnlVbmRlZlBhdHRJZHggPVxuICAgICAgICBwYXR0cy5sZW5ndGggPT09IDJcbiAgICAgICAgICA/IHBhdHRzLmZpbmRJbmRleChwYXR0ID0+IGlzVW5kZWZpbmVkUGF0dChwYXR0KSlcbiAgICAgICAgICA6IC0xO1xuICAgICAgaWYgKGJpbmFyeVVuZGVmUGF0dElkeCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzcGVjaW1lbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0c1sxIC0gYmluYXJ5VW5kZWZQYXR0SWR4XSwgY2hlY2spXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGF0dHMuc29tZShwYXR0ID0+IG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgbWF0Y2ggb25lIG9mICR7cXAocGF0dHMpfWApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbmRIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChwYXR0cywgZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICB1bmlvblJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTm90SGVscGVyID0gRmFyKCdtYXRjaDpub3QgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtxcChwYXR0KX1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja1BhdHRlcm4sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcGF0dCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJycsICd7J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU2NhbGFySGVscGVyID0gRmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoS2V5SGVscGVyID0gRmFyKCdtYXRjaDprZXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tLZXkoc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoUGF0dGVybkhlbHBlciA9IEZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1BhdHRlcm4oc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoS2luZEhlbHBlciA9IEZhcignbWF0Y2g6a2luZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiBjaGVja0tpbmQsXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRLZXlLaW5kLCBjaGVjaykgPT5cbiAgICAgIHR5cGVvZiBhbGxlZ2VkS2V5S2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBtYXRjaDpraW5kOiBwYXlsb2FkOiAke2FsbGVnZWRLZXlLaW5kfSAtIEEga2luZCBuYW1lIG11c3QgYmUgYSBzdHJpbmdgLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKGtpbmQsIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgbGV0IHN0eWxlO1xuICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOlxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIHN0eWxlID0gJ3RhZ2dlZCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHN0eWxlID0ga2luZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFRhZ2dlZEhlbHBlciA9IEZhcignbWF0Y2g6dGFnZ2VkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3RhZ1BhdHQsIHBheWxvYWRQYXR0XSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09ICd0YWdnZWQnKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEV4cGVjdGVkIHRhZ2dlZCBvYmplY3QsIG5vdCAke3EoXG4gICAgICAgICAgICBwYXNzU3R5bGVPZihzcGVjaW1lbiksXG4gICAgICAgICAgKX06ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhnZXRUYWcoc3BlY2ltZW4pLCB0YWdQYXR0LCBjaGVjaywgJ3RhZycpICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbi5wYXlsb2FkLCBwYXlsb2FkUGF0dCwgY2hlY2ssICdwYXlsb2FkJylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDp0YWdnZWQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX2tpbmQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJpZ2ludEhlbHBlciA9IEZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2JpZ2ludCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpiaWdpbnQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE5hdEhlbHBlciA9IEZhcignbWF0Y2g6bmF0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2JpZ2ludCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge2JpZ2ludH0gKi8gKHNwZWNpbWVuKSA+PSAwbixcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOm5hdCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICAvKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3RyaW5nSGVscGVyID0gRmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyaW5nTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3RyaW5nJywgY2hlY2spICYmXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICAgICAgICAgICgvKiogQHR5cGUge3N0cmluZ30gKi8gKHNwZWNpbWVuKS5sZW5ndGggPD0gc3RyaW5nTGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3RyaW5nIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXIgPSBGYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBzeW1ib2xOYW1lTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ3N5bWJvbCcsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzeW1ib2xOYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuICAgICAgaWYgKHR5cGVvZiBzeW1ib2xOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIHN5bWJvbE5hbWUubGVuZ3RoIDw9IHN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgWGBTeW1ib2wgbmFtZSAke3EoXG4gICAgICAgICAgc3ltYm9sTmFtZSxcbiAgICAgICAgKX0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpzeW1ib2wgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlciA9IEZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmVtb3RhYmxlRGVzYywgY2hlY2spID0+IHtcbiAgICAgIGlmIChpc0tpbmQoc3BlY2ltZW4sICdyZW1vdGFibGUnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVjayA9PT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHJlbW90YWJsZURlc2M7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihzcGVjaW1lbik7XG4gICAgICBjb25zdCBraW5kRGV0YWlscyA9XG4gICAgICAgIHBhc3NTdHlsZSAhPT0gJ3RhZ2dlZCdcbiAgICAgICAgICA/IC8qIFBhc3Mgc3R5bGUgY2FuIGJlIGVtYmVkZGVkIGluIGRldGFpbHMgd2l0aG91dCBxdW90ZXMuKi9cbiAgICAgICAgICAgIGIocGFzc1N0eWxlKVxuICAgICAgICAgIDogLyogVGFnIG11c3QgYmUgcXVvdGVkIGJlY2F1c2UgaXQgaXMgcG90ZW50aWFsbHkgYXR0YWNrZXItY29udHJvbGxlZCovXG4gICAgICAgICAgICAvKiAodW5saWtlIGBraW5kT2ZgLCB0aGlzIGRvZXMgbm90IHJlamVjdCB1bnJlY29nbml6ZWQgdGFncykuKi9cbiAgICAgICAgICAgIHEoZ2V0VGFnKHNwZWNpbWVuKSk7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvKiBgbGFiZWxgIGNhbiBiZSBlbWJlZGRlZCB3aXRob3V0IHF1b3RlcyBiZWNhdXNlIGl0IGlzIHByb3ZpZGVkIGJ5Ki9cbiAgICAgICAgLyogbG9jYWwgY29kZSBsaWtlIGBNLnJlbW90YWJsZShcIi4uLlwiKWAuKi9cbiAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSByZW1vdGFibGUgJHtiKGxhYmVsKX0sIG5vdCAke2tpbmREZXRhaWxzfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRSZW1vdGFibGVEZXNjLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgYWxsZWdlZFJlbW90YWJsZURlc2MsXG4gICAgICAgIGhhcmRlbih7IGxhYmVsOiBNTS5zdHJpbmcoKSB9KSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX3JlbW90YWJsZURlc2MsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hMVEVIZWxwZXIgPSBGYXIoJ21hdGNoOmx0ZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlMVEUoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHJpZ2h0T3BlcmFuZCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4gICAgICAvKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuICAgICAgLyogdG8gYmUgYGxldGAqL1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gICAgICBsZXQgW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF0gPSBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICAgICAgY29uc3QgbmV3UmlnaHRCb3VuZCA9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG4gICAgICBpZiAobmV3UmlnaHRCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJpZ2h0Qm91bmQgPSBuZXdSaWdodEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTFRIZWxwZXIgPSBGYXIoJ21hdGNoOmx0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPCAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEdURUhlbHBlciA9IEZhcignbWF0Y2g6Z3RlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4gICAgICAvKiB0byBiZSBgbGV0YCovXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdMZWZ0Qm91bmQgPSBlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuICAgICAgaWYgKG5ld0xlZnRCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxlZnRCb3VuZCA9IG5ld0xlZnRCb3VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbGVmdEJvdW5kLCByaWdodEJvdW5kXTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEdUSGVscGVyID0gRmFyKCdtYXRjaDpndCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlHVChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IG1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3ZlcixcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlciA9IEZhcignbWF0Y2g6cmVjb3JkT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVByb3BlcnRpZXNMaW1pdCwgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5UmVjb3JkJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIG93bktleXMoc3BlY2ltZW4pLmxlbmd0aCA8PSBudW1Qcm9wZXJ0aWVzTGltaXQsXG4gICAgICAgICAgWGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgICBudW1Qcm9wZXJ0aWVzTGltaXQsXG4gICAgICAgICAgKX0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gLFxuICAgICAgICApICYmXG4gICAgICAgIGVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuICAgICAgICAgIChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAga2V5Lmxlbmd0aCA8PSBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICBYYFByb3BlcnR5IG5hbWUgbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gJHtxKFxuICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5LCB2YWx1ZV0pLFxuICAgICAgICAgICAgICBoYXJkZW4oW2tleVBhdHQsIHZhbHVlUGF0dF0pLFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiBfZW50cnlQYXR0ID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQXJyYXlPZkhlbHBlciA9IEZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtzdWJQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBhcnJheUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlBcnJheScsIGNoZWNrKSAmJlxuICAgICAgICAoLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuKS5sZW5ndGggPD0gYXJyYXlMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLCBzdWJQYXR0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDphcnJheU9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJ5dGVBcnJheUhlbHBlciA9IEZhcignbWF0Y2g6Ynl0ZUFycmF5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGJ5dGVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdieXRlQXJyYXknLCBjaGVjaykgJiZcbiAgICAgICAgKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChzcGVjaW1lbikuYnl0ZUxlbmd0aCA8PSBieXRlTGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBieXRlQXJyYXkgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtieXRlTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJ5dGVBcnJheSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYnl0ZUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU2V0T2ZIZWxwZXIgPSBGYXIoJ21hdGNoOnNldE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2tleVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVNldEVsZW1lbnRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5U2V0JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPCBudW1TZXRFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuICAgICAgICAgIH1gLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCwga2V5UGF0dCwgY2hlY2ssICdzZXQgZWxlbWVudHMnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnNldE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJhZ09mSGVscGVyID0gRmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCwgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUJhZycsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4ucGF5bG9hZCkubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgKX0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbiAgICAgICAgICAoW2tleSwgY291bnRdLCBpKSA9PlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKGtleSwga2V5UGF0dCwgY2hlY2ssIGBiYWcga2V5c1ske2l9XWApICYmXG4gICAgICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgICAgICBbY291bnQsIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2tdLFxuICAgICAgICAgICAgICBgYmFnIGNvdW50c1ske2l9XWAsXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICBjaGVja01hdGNoZXMoY291bnQsIGNvdW50UGF0dCwgY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCksXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJhZ09mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5fSBlbGVtZW50c1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Q29weUFycmF5fSBbaW5SZXN1bHRzXVxuICogQHBhcmFtIHtDb3B5QXJyYXl9IFtvdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBlbGVtZW50c0hhc1NwbGl0ID0gKFxuICAgIGVsZW1lbnRzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvKiBTaW5jZSB0aGlzIGZlYXR1cmUgaXMgbW90aXZhdGVkIGJ5IEVSVFAncyB1c2Ugb24qL1xuICAgIC8qIG5vbi1mdW5naWJsZSAoYHNldGAsIGBjb3B5U2V0YCkgYW1vdW50cywqL1xuICAgIC8qIHRoZWlyIGFycmF5cyBzdG9yZSB0aGVpciBlbGVtZW50cyBpbiBkZWNlbmRpbmcgbGV4aWNvZ3JhcGhpYyBvcmRlci4qL1xuICAgIC8qIEJ1dCB0aGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHNvbWUgY2hvaWNlIGFtb3VuZyBlcXVhbGx5IGdvb2QgbWluaW1hbCovXG4gICAgLyogcmVzdWx0cy4gSXQgaXMgbW9yZSBpbnR1aXRpdmUgZm9yIHRoZSBjaG9pY2UgdG8gYmUgdGhlIGZpcnN0IGBib3VuZGAqL1xuICAgIC8qIG1hdGNoaW5nIGVsZW1lbnRzIGluIGFzY2VuZGluZyBsZXhpY2lncmFwaGljIG9yZGVyLCByYXRoZXIgdGhhbiovXG4gICAgLyogZGVjZW5kaW5nLiBUaHVzIHdlIGl0ZXJhdGUgYGVsZW1lbnRzYCBpbiByZXZlcnNlIG9yZGVyLiovXG4gICAgZm9yIChsZXQgaSA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY291bnQgPCBib3VuZCkge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBjb3VudCArPSAxbjtcbiAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBwYWlyc1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBbaW5SZXN1bHRzXVxuICogQHBhcmFtIHtDb3B5QXJyYXk8W0tleSwgYmlnaW50XT59IFtvdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBwYWlyc0hhc1NwbGl0ID0gKFxuICAgIHBhaXJzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvKiBTaW5jZSB0aGlzIGZlYXR1cmUgaXMgbW90aXZhdGVkIGJ5IEVSVFAncyB1c2Ugb24qL1xuICAgIC8qIHNlbWktZnVuZ2libGUgKGBjb3B5QmFnYCkgYW1vdW50cywqL1xuICAgIC8qIHRoZWlyIGFycmF5cyBzdG9yZSB0aGVpciBlbGVtZW50cyBpbiBkZWNlbmRpbmcgbGV4aWNvZ3JhcGhpYyBvcmRlci4qL1xuICAgIC8qIEJ1dCB0aGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHNvbWUgY2hvaWNlIGFtb3VuZyBlcXVhbGx5IGdvb2QgbWluaW1hbCovXG4gICAgLyogcmVzdWx0cy4gSXQgaXMgbW9yZSBpbnR1aXRpdmUgZm9yIHRoZSBjaG9pY2UgdG8gYmUgdGhlIGZpcnN0IGBib3VuZGAqL1xuICAgIC8qIG1hdGNoaW5nIGVsZW1lbnRzIGluIGFzY2VuZGluZyBsZXhpY2lncmFwaGljIG9yZGVyLCByYXRoZXIgdGhhbiovXG4gICAgLyogZGVjZW5kaW5nLiBUaHVzIHdlIGl0ZXJhdGUgYHBhaXJzYCBpbiByZXZlcnNlIG9yZGVyLiovXG4gICAgZm9yIChsZXQgaSA9IHBhaXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBbZWxlbWVudCwgbnVtXSA9IHBhaXJzW2ldO1xuICAgICAgY29uc3QgbnVtUmVzdCA9IGJvdW5kIC0gY291bnQ7XG4gICAgICBpZiAobnVtUmVzdCA+PSAxbikge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBpZiAobnVtIDw9IG51bVJlc3QpIHtcbiAgICAgICAgICAgIGNvdW50ICs9IG51bTtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbnVtSW4gPSBudW1SZXN0O1xuICAgICAgICAgICAgY291bnQgKz0gbnVtSW47XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtUmVzdF0pO1xuICAgICAgICAgICAgaWYgKG91dFJlc3VsdHMpIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtIC0gbnVtUmVzdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBjb3VudCA+PSBib3VuZCxcbiAgICAgIFhgSGFzIG9ubHkgJHtxKGNvdW50KX0gbWF0Y2hlcywgYnV0IG5lZWRzICR7cShib3VuZCl9YCxcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICogQHR5cGVkZWYge0NvcHlBcnJheSB8IENvcHlTZXQgfCBDb3B5QmFnfSBDb250YWluZXJcbiAqIEBwYXJhbSB7Q29udGFpbmVyfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW25lZWRJblJlc3VsdHNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtuZWVkT3V0UmVzdWx0c11cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge1tDb250YWluZXIgfCB1bmRlZmluZWQsIENvbnRhaW5lciB8IHVuZGVmaW5lZF0gfCBmYWxzZX1cbiAqL1xuICBjb25zdCBjb250YWluZXJIYXNTcGxpdCA9IChcbiAgICBzcGVjaW1lbixcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBuZWVkSW5SZXN1bHRzID0gZmFsc2UsXG4gICAgbmVlZE91dFJlc3VsdHMgPSBmYWxzZSxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgY29uc3QgaW5SZXN1bHRzID0gbmVlZEluUmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91dFJlc3VsdHMgPSBuZWVkT3V0UmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4pO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVsZW1lbnRzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvKiBjaGVjayBsb2dpYyBhbHJlYWR5IHBlcmZvcm1lZCBieSBlbGVtZW50c0hhc1NwbGl0Ki9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtpblJlc3VsdHMsIG91dFJlc3VsdHNdO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFlbGVtZW50c0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZCxcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBpblJlc3VsdHMgJiYgbWFrZUNvcHlTZXQoaW5SZXN1bHRzKSxcbiAgICAgICAgICBvdXRSZXN1bHRzICYmIG1ha2VDb3B5U2V0KG91dFJlc3VsdHMpLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFwYWlyc0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZCxcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBpblJlc3VsdHMgJiYgbWFrZUNvcHlCYWcoaW5SZXN1bHRzKSxcbiAgICAgICAgICBvdXRSZXN1bHRzICYmIG1ha2VDb3B5QmFnKG91dFJlc3VsdHMpLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdW5leHBlY3RlZCAke3Eoa2luZCl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQ29udGFpbmVySGFzSGVscGVyID0gRmFyKCdNLmNvbnRhaW5lckhhcyBoZWxwZXInLCB7XG4gICAgLyoqXG4gKiBAcGFyYW0ge0NvcHlBcnJheSB8IENvcHlTZXQgfCBDb3B5QmFnfSBzcGVjaW1lblxuICogQHBhcmFtIHtbUGF0dGVybiwgYmlnaW50LCBMaW1pdHM/XX0gcGF5bG9hZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtlbGVtZW50UGF0dCwgYm91bmQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKFxuICAgICAgICAhYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgIFtib3VuZCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgYCR7a2luZH0gbWF0Y2hlc2AsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gISFjb250YWluZXJIYXNTcGxpdChcbiAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICBib3VuZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjaGVjayxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLmd0ZSgxbildKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdNLmNvbnRhaW5lckhhcyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hNYXBPZkhlbHBlciA9IEZhcignbWF0Y2g6bWFwT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bU1hcEVudHJpZXNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlNYXAnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuLnBheWxvYWQua2V5cykubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgICAgWGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgICl9IGVudHJpZXM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQua2V5cyxcbiAgICAgICAgICBrZXlQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAga2V5cycsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbiAgICAgICAgICB2YWx1ZVBhdHQsXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgJ21hcCB2YWx1ZXMnLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDptYXBPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuICBjb25zdCBzcGxpdEFycmF5UGFydHMgPSAoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KSA9PiB7XG4gICAgY29uc3QgbnVtUmVxdWlyZWQgPSByZXF1aXJlZFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IG51bU9wdGlvbmFsID0gb3B0aW9uYWxQYXR0Lmxlbmd0aDtcbiAgICBjb25zdCByZXF1aXJlZFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UoMCwgbnVtUmVxdWlyZWQpO1xuICAgIGNvbnN0IG9wdGlvbmFsU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZShcbiAgICAgIG51bVJlcXVpcmVkLFxuICAgICAgbnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3RTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKG51bVJlcXVpcmVkICsgbnVtT3B0aW9uYWwpO1xuICAgIHJldHVybiBoYXJkZW4oeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG4gIGNvbnN0IGFkYXB0QXJyYXlQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbGVuZ3RoKSA9PlxuICAgIGhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCwgbGVuZ3RoKS5tYXAocGF0dCA9PiBNTS5vcHQocGF0dCkpKTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0QXJyYXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSBbXSwgcmVzdFBhdHQgPSBNTS5hbnkoKV0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0gPVxuICAgICAgICBzcGxpdEFycmF5UGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcbiAgICAgIGNvbnN0IHBhcnRpYWxQYXR0ID0gYWRhcHRBcnJheVBhdHRlcm4oXG4gICAgICAgIG9wdGlvbmFsUGF0dCxcbiAgICAgICAgb3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgsXG4gICAgICApO1xuICAgICAgbGV0IGFyZ051bSA9IDA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGggPT09IHJlcXVpcmVkUGF0dC5sZW5ndGggfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG4gICAgICAgICAgICAgIHJlcXVpcmVkUGF0dC5sZW5ndGgsXG4gICAgICAgICAgICApfSBhcmd1bWVudHM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgICApKSAmJlxuICAgICAgICByZXF1aXJlZFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbiAgICAgICAgICBjaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbltpXSwgcCwgY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBwYXJ0aWFsUGF0dC5ldmVyeSgocCwgaSkgPT5cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhvcHRpb25hbFNwZWNpbWVuW2ldLCBwLCBjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLCByZXN0UGF0dCwgY2hlY2ssICcuLi5yZXN0JylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChzcGxpdEFycmF5LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzU3R5bGVPZihzcGxpdEFycmF5KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsIHJlc3RQYXR0ID0gdW5kZWZpbmVkXSA9XG4gICAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzUGF0dGVybihyZXF1aXJlZFBhdHQpICYmXG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weUFycmF5JykpICYmXG4gICAgICAgICAgKHJlc3RQYXR0ID09PSB1bmRlZmluZWQgfHwgaXNQYXR0ZXJuKHJlc3RQYXR0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICBfcmVxdWlyZWRQYXR0LFxuICAgICAgX29wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCxcbiAgICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZCxcbiAgICBdKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG4gIGNvbnN0IHNwbGl0UmVjb3JkUGFydHMgPSAoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KSA9PiB7XG4gICAgLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbiAgICBjb25zdCByZXF1aXJlZEVudHJpZXMgPSBbXTtcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuICAgIGNvbnN0IG9wdGlvbmFsRW50cmllcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG4gICAgY29uc3QgcmVzdEVudHJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcyhzcGVjaW1lbikpIHtcbiAgICAgIGlmIChoYXNPd24ocmVxdWlyZWRQYXR0LCBuYW1lKSkge1xuICAgICAgICByZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzT3duKG9wdGlvbmFsUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0RW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHJlcXVpcmVkU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG4gICAgICBvcHRpb25hbFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxuICAgICAgcmVzdFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyksXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiB2YWx1ZXMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuICBjb25zdCBhZGFwdFJlY29yZFBhdHRlcm4gPSAob3B0aW9uYWxQYXR0LCBuYW1lcykgPT5cbiAgICBmcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTcGxpdFJlY29yZEhlbHBlciA9IEZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB7fSwgcmVzdFBhdHQgPSBNTS5hbnkoKV0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVJlY29yZCcsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgICAgc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpO1xuXG4gICAgICBjb25zdCBwYXJ0aWFsTmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKSk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQsIHBhcnRpYWxOYW1lcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBjaGVjaykgJiZcbiAgICAgICAgcGFydGlhbE5hbWVzLmV2ZXJ5KG5hbWUgPT5cbiAgICAgICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgICAgICBvcHRpb25hbFNwZWNpbWVuW25hbWVdLFxuICAgICAgICAgICAgcGFydGlhbFBhdHRbbmFtZV0sXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIGAke25hbWV9P2AsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLCByZXN0UGF0dCwgY2hlY2ssICcuLi5yZXN0JylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChzcGxpdEFycmF5LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzU3R5bGVPZihzcGxpdEFycmF5KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsIHJlc3RQYXR0ID0gdW5kZWZpbmVkXSA9XG4gICAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzUGF0dGVybihyZXF1aXJlZFBhdHQpICYmXG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSA9PT0gJ2NvcHlSZWNvcmQnICYmXG4gICAgICAgICAgKG9wdGlvbmFsUGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkgJiZcbiAgICAgICAgICAgICAgcGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KSA9PT0gJ2NvcHlSZWNvcmQnKSkgJiZcbiAgICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG4gICAgICAgICAgc3BsaXRBcnJheSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoW1xuICAgICAgcmVxdWlyZWRQYXR0LFxuICAgICAgX29wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCxcbiAgICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZCxcbiAgICBdKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNYXRjaEhlbHBlcj59ICovXG4gIGNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnID0gaGFyZGVuKHtcbiAgICAnbWF0Y2g6YW55JzogbWF0Y2hBbnlIZWxwZXIsXG4gICAgJ21hdGNoOmFuZCc6IG1hdGNoQW5kSGVscGVyLFxuICAgICdtYXRjaDpvcic6IG1hdGNoT3JIZWxwZXIsXG4gICAgJ21hdGNoOm5vdCc6IG1hdGNoTm90SGVscGVyLFxuXG4gICAgJ21hdGNoOnNjYWxhcic6IG1hdGNoU2NhbGFySGVscGVyLFxuICAgICdtYXRjaDprZXknOiBtYXRjaEtleUhlbHBlcixcbiAgICAnbWF0Y2g6cGF0dGVybic6IG1hdGNoUGF0dGVybkhlbHBlcixcbiAgICAnbWF0Y2g6a2luZCc6IG1hdGNoS2luZEhlbHBlcixcbiAgICAnbWF0Y2g6dGFnZ2VkJzogbWF0Y2hUYWdnZWRIZWxwZXIsXG4gICAgJ21hdGNoOmJpZ2ludCc6IG1hdGNoQmlnaW50SGVscGVyLFxuICAgICdtYXRjaDpuYXQnOiBtYXRjaE5hdEhlbHBlcixcbiAgICAnbWF0Y2g6c3RyaW5nJzogbWF0Y2hTdHJpbmdIZWxwZXIsXG4gICAgJ21hdGNoOnN5bWJvbCc6IG1hdGNoU3ltYm9sSGVscGVyLFxuICAgICdtYXRjaDpyZW1vdGFibGUnOiBtYXRjaFJlbW90YWJsZUhlbHBlcixcblxuICAgICdtYXRjaDpsdCc6IG1hdGNoTFRIZWxwZXIsXG4gICAgJ21hdGNoOmx0ZSc6IG1hdGNoTFRFSGVscGVyLFxuICAgICdtYXRjaDpndGUnOiBtYXRjaEdURUhlbHBlcixcbiAgICAnbWF0Y2g6Z3QnOiBtYXRjaEdUSGVscGVyLFxuXG4gICAgJ21hdGNoOmFycmF5T2YnOiBtYXRjaEFycmF5T2ZIZWxwZXIsXG4gICAgJ21hdGNoOmJ5dGVBcnJheSc6IG1hdGNoQnl0ZUFycmF5SGVscGVyLFxuICAgICdtYXRjaDpyZWNvcmRPZic6IG1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4gICAgJ21hdGNoOnNldE9mJzogbWF0Y2hTZXRPZkhlbHBlcixcbiAgICAnbWF0Y2g6YmFnT2YnOiBtYXRjaEJhZ09mSGVscGVyLFxuICAgICdtYXRjaDpjb250YWluZXJIYXMnOiBtYXRjaENvbnRhaW5lckhhc0hlbHBlcixcbiAgICAnbWF0Y2g6bWFwT2YnOiBtYXRjaE1hcE9mSGVscGVyLFxuICAgICdtYXRjaDpzcGxpdEFycmF5JzogbWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuICAgICdtYXRjaDpzcGxpdFJlY29yZCc6IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIsXG4gIH0pO1xuXG4gIGNvbnN0IG1ha2VNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXIgPSBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG4gICAgYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbiAgICByZXR1cm4gbWF0Y2hlcjtcbiAgfTtcblxuICBjb25zdCBtYWtlS2luZE1hdGNoZXIgPSBraW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpraW5kJywga2luZCk7XG5cbiAgY29uc3QgQW55U2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6YW55JywgdW5kZWZpbmVkKTtcbiAgY29uc3QgU2NhbGFyU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJywgdW5kZWZpbmVkKTtcbiAgY29uc3QgS2V5U2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6a2V5JywgdW5kZWZpbmVkKTtcbiAgY29uc3QgUGF0dGVyblNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOnBhdHRlcm4nLCB1bmRlZmluZWQpO1xuICBjb25zdCBCb29sZWFuU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbiAgY29uc3QgTnVtYmVyU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ251bWJlcicpO1xuICBjb25zdCBCaWdJbnRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJpZ2ludCcsIFtdKTtcbiAgY29uc3QgTmF0U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpuYXQnLCBbXSk7XG4gIGNvbnN0IFN0cmluZ1NoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJywgW10pO1xuICBjb25zdCBTeW1ib2xTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnN5bWJvbCcsIFtdKTtcbiAgY29uc3QgUmVjb3JkU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpyZWNvcmRPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgQXJyYXlTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmFycmF5T2YnLCBbQW55U2hhcGVdKTtcbiAgY29uc3QgQnl0ZUFycmF5U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpieXRlQXJyYXknLCBbXSk7XG4gIGNvbnN0IFNldFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c2V0T2YnLCBbQW55U2hhcGVdKTtcbiAgY29uc3QgQmFnU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgTWFwU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgUmVtb3RhYmxlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuICBjb25zdCBFcnJvclNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdlcnJvcicpO1xuICBjb25zdCBQcm9taXNlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbiAgY29uc3QgVW5kZWZpbmVkU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4gIC8qKlxuICogRm9yIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCBpcyB0aGUgb3B0aW9uYWwgbGltaXRzLFxuICogc28gdGhhdCB3aGVuIGl0IGlzIGB1bmRlZmluZWRgIGl0IGlzIGRyb3BwZWQgZnJvbSB0aGUgZW5kIG9mIHRoZVxuICogcGF5bG9hZHMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXlsb2FkXG4gKi9cbiAgY29uc3QgbWFrZUxpbWl0c01hdGNoZXIgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gICAgaWYgKHBheWxvYWRbcGF5bG9hZC5sZW5ndGggLSAxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkID0gaGFyZGVuKHBheWxvYWQuc2xpY2UoMCwgcGF5bG9hZC5sZW5ndGggLSAxKSk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlTWF0Y2hlcih0YWcsIHBheWxvYWQpO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VSZW1vdGFibGVNYXRjaGVyID0gKGxhYmVsID0gdW5kZWZpbmVkKSA9PlxuICAgIGxhYmVsID09PSB1bmRlZmluZWRcbiAgICAgID8gUmVtb3RhYmxlU2hhcGVcbiAgICAgIDogbWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsIGhhcmRlbih7IGxhYmVsIH0pKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IGVtcHR5XG4gKiBAcGFyYW0ge1R9IGJhc2VcbiAqIEBwYXJhbSB7VH0gW29wdGlvbmFsXVxuICogQHBhcmFtIHtUfSBbcmVzdF1cbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgY29uc3QgbWFrZVNwbGl0UGF5bG9hZCA9IChcbiAgICBlbXB0eSxcbiAgICBiYXNlLFxuICAgIG9wdGlvbmFsID0gdW5kZWZpbmVkLFxuICAgIHJlc3QgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIGlmIChyZXN0KSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsIHx8IGVtcHR5LCByZXN0XTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIFtiYXNlXTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbiAgY29uc3QgTSA9IGhhcmRlbih7XG4gICAgYW55OiAoKSA9PiBBbnlTaGFwZSxcbiAgICBhbmQ6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcsIHBhdHRzKSxcbiAgICBvcjogKC4uLnBhdHRzKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6b3InLCBwYXR0cyksXG4gICAgbm90OiBzdWJQYXR0ID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLCBzdWJQYXR0KSxcblxuICAgIHNjYWxhcjogKCkgPT4gU2NhbGFyU2hhcGUsXG4gICAga2V5OiAoKSA9PiBLZXlTaGFwZSxcbiAgICBwYXR0ZXJuOiAoKSA9PiBQYXR0ZXJuU2hhcGUsXG4gICAga2luZDogbWFrZUtpbmRNYXRjaGVyLFxuICAgIHRhZ2dlZDogKHRhZ1BhdHQgPSBNLnN0cmluZygpLCBwYXlsb2FkUGF0dCA9IE0uYW55KCkpID0+XG4gICAgICBtYWtlTWF0Y2hlcignbWF0Y2g6dGFnZ2VkJywgaGFyZGVuKFt0YWdQYXR0LCBwYXlsb2FkUGF0dF0pKSxcbiAgICBib29sZWFuOiAoKSA9PiBCb29sZWFuU2hhcGUsXG4gICAgbnVtYmVyOiAoKSA9PiBOdW1iZXJTaGFwZSxcbiAgICBiaWdpbnQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JywgW2xpbWl0c10pIDogQmlnSW50U2hhcGUsXG4gICAgbmF0OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsIFtsaW1pdHNdKSA6IE5hdFNoYXBlLFxuICAgIHN0cmluZzogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLCBbbGltaXRzXSkgOiBTdHJpbmdTaGFwZSxcbiAgICBzeW1ib2w6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJywgW2xpbWl0c10pIDogU3ltYm9sU2hhcGUsXG4gICAgcmVjb3JkOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5yZWNvcmRPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogUmVjb3JkU2hhcGUsXG4gICAgLyogc3RydWN0OiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlSZWNvcmRzIHdpdGggYSBmaXhlZCBxdWFudGl0eSBvZiovXG4gICAgLyogZW50cmllcyB3aGVyZSB0aGUgdmFsdWVzIG1hdGNoIHBhdHRlcm5zIGZvciBjb3JyZXNwb25kaW5nIGtleXMgaXMgbWVyZWx5Ki9cbiAgICAvKiBhIGhhcmRlbmVkIG9iamVjdCB3aXRoIHBhdHRlcm5zIGluIHRoZSBwbGFjZXMgb2YgdmFsdWVzIGZvciovXG4gICAgLyogY29ycmVzcG9uZGluZyBrZXlzLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weVJlY29yZHMgdGhhdCBoYXZlIGEgc3RyaW5nIHZhbHVlKi9cbiAgICAvKiBmb3IgdGhlIGtleSAneCcgYW5kIGEgbnVtYmVyIGZvciB0aGUga2V5ICd5JyBpczoqL1xuICAgIC8qIGhhcmRlbih7IHg6IE0uc3RyaW5nKCksIHk6IE0ubnVtYmVyKCkgfSkuKi9cbiAgICBhcnJheTogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0uYXJyYXlPZihNLmFueSgpLCBsaW1pdHMpIDogQXJyYXlTaGFwZSxcbiAgICAvKiB0dXBsZTogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5QXJyYXlzIHdpdGggYSBmaXhlZCBxdWFudGl0eSBvZiB2YWx1ZXMqL1xuICAgIC8qIHRoYXQgbWF0Y2ggYSBoZXRlcm9nZW5lb3VzIGFycmF5IG9mIHBhdHRlcm5zIGlzIG1lcmVseSBhIGhhcmRlbmVkIGFycmF5Ki9cbiAgICAvKiBvZiB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucy4qL1xuICAgIC8qIEZvciBleGFtcGxlLCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlBcnJheXMgb2YgbGVuZ3RoIDIgdGhhdCBoYXZlIGEqL1xuICAgIC8qIHN0cmluZyBhdCBpbmRleCAwIGFuZCBhIG51bWJlciBhdCBpbmRleCAxIGlzOiovXG4gICAgLyogaGFyZGVuKFsgTS5zdHJpbmcoKSwgTS5udW1iZXIoKSBdKS4qL1xuICAgIGJ5dGVBcnJheTogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpieXRlQXJyYXknLCBbbGltaXRzXSkgOiBCeXRlQXJyYXlTaGFwZSxcbiAgICBzZXQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+IChsaW1pdHMgPyBNLnNldE9mKE0uYW55KCksIGxpbWl0cykgOiBTZXRTaGFwZSksXG4gICAgYmFnOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5iYWdPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogQmFnU2hhcGUsXG4gICAgbWFwOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5tYXBPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogTWFwU2hhcGUsXG4gICAgLyogaGV0ZXJvZ2VuZW91cyBtYXA6IEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weU1hcHMgd2l0aCBhIGZpeGVkIHF1YW50aXR5Ki9cbiAgICAvKiBvZiBlbnRyaWVzIHdoZXJlIHRoZSB2YWx1ZSBmb3IgZWFjaCBrZXkgbWF0Y2hlcyBhIGNvcnJlc3BvbmRpbmcgcGF0dGVybiovXG4gICAgLyogaXMgbWVyZWx5IGEgKGhhcmRlbmVkKSBDb3B5TWFwIHdpdGggcGF0dGVybnMgaW5zdGVhZCBvZiB2YWx1ZXMgZm9yIHRoZSovXG4gICAgLyogY29ycmVzcG9uZGluZyBrZXlzLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weU1hcHMgd2hlcmUgdGhlIHZhbHVlIGZvciB0aGUga2V5Ki9cbiAgICAvKiAneCcgaXMgYSBudW1iZXIgYW5kIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSAneScgaXMgYSBzdHJpbmcgaXM6Ki9cbiAgICAvKiBtYWtlQ29weU1hcChbWyd4JywgTS5udW1iZXIoKV0sIFsneScsIE0uc3RyaW5nKCldXSkuKi9cbiAgICByZW1vdGFibGU6IG1ha2VSZW1vdGFibGVNYXRjaGVyLFxuICAgIGVycm9yOiAoKSA9PiBFcnJvclNoYXBlLFxuICAgIHByb21pc2U6ICgpID0+IFByb21pc2VTaGFwZSxcbiAgICB1bmRlZmluZWQ6ICgpID0+IFVuZGVmaW5lZFNoYXBlLFxuICAgIG51bGw6ICgpID0+IG51bGwsXG5cbiAgICBsdDogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpsdCcsIHJpZ2h0T3BlcmFuZCksXG4gICAgbHRlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZXE6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXkoa2V5KTtcbiAgICAgIHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/IE0udW5kZWZpbmVkKCkgOiBrZXk7XG4gICAgfSxcbiAgICBuZXE6IGtleSA9PiBNLm5vdChNLmVxKGtleSkpLFxuICAgIGd0ZTogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLCByaWdodE9wZXJhbmQpLFxuICAgIGd0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0JywgcmlnaHRPcGVyYW5kKSxcblxuICAgIHJlY29yZE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIHZhbHVlUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0c10pLFxuICAgIGFycmF5T2Y6IChzdWJQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLCBbc3ViUGF0dCwgbGltaXRzXSksXG4gICAgc2V0T2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJywgW2tleVBhdHQsIGxpbWl0c10pLFxuICAgIGJhZ09mOiAoa2V5UGF0dCA9IE0uYW55KCksIGNvdW50UGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0c10pLFxuICAgIGNvbnRhaW5lckhhczogKGVsZW1lbnRQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gMW4sIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpjb250YWluZXJIYXMnLCBbZWxlbWVudFBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgbWFwT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgc3BsaXRBcnJheTogKGJhc2UsIG9wdGlvbmFsID0gdW5kZWZpbmVkLCByZXN0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoXG4gICAgICAgICdtYXRjaDpzcGxpdEFycmF5JyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZChbXSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdFJlY29yZDogKGJhc2UsIG9wdGlvbmFsID0gdW5kZWZpbmVkLCByZXN0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoXG4gICAgICAgICdtYXRjaDpzcGxpdFJlY29yZCcsXG4gICAgICAgIG1ha2VTcGxpdFBheWxvYWQoe30sIGJhc2UsIG9wdGlvbmFsLCByZXN0KSxcbiAgICAgICksXG4gICAgc3BsaXQ6IChiYXNlLCByZXN0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSwgcmVzdCAmJiBbXSwgcmVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTS5zcGxpdFJlY29yZChiYXNlLCByZXN0ICYmIHt9LCByZXN0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHBhcnRpYWw6IChiYXNlLCByZXN0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoW10sIGJhc2UsIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sIGJhc2UsIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcmVmOiB0ID0+IE0ub3IodCwgTS5wcm9taXNlKCkpLFxuICAgIG9wdDogdCA9PiBNLm9yKE0udW5kZWZpbmVkKCksIHQpLFxuXG4gICAgaW50ZXJmYWNlOiAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpLFxuICAgIGNhbGw6ICguLi5hcmdQYXR0ZXJucykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsIGFyZ1BhdHRlcm5zKSxcbiAgICBjYWxsV2hlbjogKC4uLmFyZ0d1YXJkcykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLCBhcmdHdWFyZHMpLFxuXG4gICAgYXdhaXQ6IGFyZ1BhdHRlcm4gPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlQXdhaXRBcmdHdWFyZChhcmdQYXR0ZXJuKSxcbiAgICByYXc6ICgpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZVJhd0d1YXJkKCksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNoZWNrTWF0Y2hlcyxcbiAgICBtYXRjaGVzLFxuICAgIG11c3RNYXRjaCxcbiAgICBhc3NlcnRQYXR0ZXJuLFxuICAgIGlzUGF0dGVybixcbiAgICBnZXRSYW5rQ292ZXIsXG4gICAgTSxcbiAgICBraW5kT2YsXG4gICAgY29udGFpbmVySGFzU3BsaXQsXG4gIH0pO1xufTtcblxuLyogT25seSBpbmNsdWRlIHRob3NlIHdob3NlIG1lYW5pbmcgaXMgaW5kZXBlbmRlbnQgb2YgYW4gaW1wdXRlZCBzb3J0IG9yZGVyKi9cbi8qIG9mIHJlbW90YWJsZXMsIG9yIG9mIGVuY29kaW5nIG9mIHBhc3NhYmxlIGFzIHNvcnRhYmxlIHN0cmluZ3MuIFRodXMsKi9cbi8qIGdldFJhbmtDb3ZlciBpcyBvbWl0dGVkLiBUbyBnZXQgb25lLCB5b3UnZCBuZWVkIHRvIGluc3RhbnRpYXRlKi9cbi8qIGBtYWtlUGF0dGVybktpdCgpYCB5b3Vyc2VsZi4gU2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBleHRlcm5hbCovXG4vKiB1c2VzIG9mIGBnZXRSYW5rQ292ZXJgLCBmb3IgY2xhcml0eSBkdXJpbmcgZGV2ZWxvcG1lbnQsIGBtYWtlUGF0dGVybktpdGAqL1xuLyogaXMgbm90IGN1cnJlbnRseSBleHBvcnRlZC4qL1xuICAgICAgIGNvbnN0IHtcbiAgY2hlY2tNYXRjaGVzLFxuICBtYXRjaGVzLFxuICBtdXN0TWF0Y2gsXG4gIGFzc2VydFBhdHRlcm4sXG4gIGlzUGF0dGVybixcbiAgZ2V0UmFua0NvdmVyLFxuICBNLFxuICBraW5kT2YsXG4gIGNvbnRhaW5lckhhc1NwbGl0LFxufSA9IG1ha2VQYXR0ZXJuS2l0KCk7JGjNj19vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRozY9fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaM2PX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaM2PX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjNj19vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRozY9fb25jZS5NKE0pOyRozY9fb25jZS5raW5kT2Yoa2luZE9mKTskaM2PX29uY2UuY29udGFpbmVySGFzU3BsaXQoY29udGFpbmVySGFzU3BsaXQpO1xuXG5NTSA9IE07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3VhcmRzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE0uYXdhaXQoLi4uKSovXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbiAgICAgICBjb25zdCBBd2FpdEFyZ0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBBd2FpdEFyZ0d1YXJkfVxuICovJGjNj19vbmNlLkF3YWl0QXJnR3VhcmRTaGFwZShBd2FpdEFyZ0d1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGlzQXdhaXRBcmdHdWFyZCA9IHNwZWNpbWVuID0+XG4gIG1hdGNoZXMoc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzQXdhaXRBcmdHdWFyZChpc0F3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGlzQXdhaXRBcmdHdWFyZCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBBd2FpdEFyZ0d1YXJkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXdhaXRBcmdHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBBd2FpdEFyZ0d1YXJkU2hhcGUsICdhd2FpdEFyZ0d1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRBd2FpdEFyZ0d1YXJkKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gYXJnUGF0dGVyblxuICogQHJldHVybnMge0F3YWl0QXJnR3VhcmR9XG4gKi9cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkID0gYXJnUGF0dGVybiA9PiB7XG4gIC8qKiBAdHlwZSB7QXdhaXRBcmdHdWFyZH0gKi9cbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6YXdhaXRBcmdHdWFyZCcsIHtcbiAgICBhcmdHdWFyZDogYXJnUGF0dGVybixcbiAgfSk7XG4gIGFzc2VydEF3YWl0QXJnR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIE0ucmF3KCkqL1xuXG5jb25zdCBSYXdHdWFyZFBheWxvYWRTaGFwZSA9IE0ucmVjb3JkKCk7XG5cbiAgICAgICBjb25zdCBSYXdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDpyYXdHdWFyZCcpOyRozY9fb25jZS5SYXdHdWFyZFNoYXBlKFJhd0d1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNSYXdHdWFyZCA9IHNwZWNpbWVuID0+IG1hdGNoZXMoc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc1Jhd0d1YXJkKGlzUmF3R3VhcmQpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UmF3R3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtdXN0TWF0Y2goc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUsICdyYXdHdWFyZCcpO1xuXG4vKipcbiAqIEByZXR1cm5zIHtSYXdHdWFyZH1cbiAqLyRozY9fb25jZS5hc3NlcnRSYXdHdWFyZChhc3NlcnRSYXdHdWFyZCk7XG5jb25zdCBtYWtlUmF3R3VhcmQgPSAoKSA9PiBtYWtlVGFnZ2VkKCdndWFyZDpyYXdHdWFyZCcsIHt9KTtcblxuLyogTS5jYWxsKC4uLikqL1xuLyogTS5jYWxsV2hlbiguLi4pKi9cblxuICAgICAgIGNvbnN0IFN5bmNWYWx1ZUd1YXJkU2hhcGUgPSBNLm9yKFJhd0d1YXJkU2hhcGUsIE0ucGF0dGVybigpKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRTaGFwZShTeW5jVmFsdWVHdWFyZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKFN5bmNWYWx1ZUd1YXJkU2hhcGUpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZExpc3RTaGFwZShTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IEFyZ0d1YXJkU2hhcGUgPSBNLm9yKFJhd0d1YXJkU2hhcGUsIEF3YWl0QXJnR3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpO1xuICAgICAgIGNvbnN0IEFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKEFyZ0d1YXJkU2hhcGUpOyRozY9fb25jZS5BcmdHdWFyZExpc3RTaGFwZShBcmdHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnc3luYycsXG4gIGFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gIG9wdGlvbmFsQXJnR3VhcmRzOiBNLm9wdChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSksXG4gIHJlc3RBcmdHdWFyZDogTS5vcHQoU3luY1ZhbHVlR3VhcmRTaGFwZSksXG4gIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxufSk7XG5cbmNvbnN0IEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBoYXJkZW4oe1xuICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgYXJnR3VhcmRzOiBBcmdHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KEFyZ0d1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuICAgICAgIGNvbnN0IE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gTS5vcihcbiAgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuICBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuKTskaM2PX29uY2UuTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIE1ldGhvZEd1YXJkfVxuICovJGjNj19vbmNlLk1ldGhvZEd1YXJkU2hhcGUoTWV0aG9kR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0TWV0aG9kR3VhcmQgPSBzcGVjaW1lbiA9PiB7XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgTWV0aG9kR3VhcmRTaGFwZSwgJ21ldGhvZEd1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRNZXRob2RHdWFyZChhc3NlcnRNZXRob2RHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0TWV0aG9kR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7J3N5bmMnfCdhc3luYyd9IGNhbGxLaW5kXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IGFyZ0d1YXJkc1xuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBbb3B0aW9uYWxBcmdHdWFyZHNdXG4gKiBAcGFyYW0ge1N5bmNWYWx1ZUd1YXJkfSBbcmVzdEFyZ0d1YXJkXVxuICogQHJldHVybnMge01ldGhvZEd1YXJkTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyID0gKFxuICBjYWxsS2luZCxcbiAgYXJnR3VhcmRzLFxuICBvcHRpb25hbEFyZ0d1YXJkcyA9IHVuZGVmaW5lZCxcbiAgcmVzdEFyZ0d1YXJkID0gdW5kZWZpbmVkLFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIG9wdGlvbmFsOiAoLi4ub3B0QXJnR3VhcmRzKSA9PiB7XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsIGFyZ0d1YXJkcywgb3B0QXJnR3VhcmRzKTtcbiAgICB9LFxuICAgIHJlc3Q6IHJBcmdHdWFyZCA9PiB7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fCBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJBcmdHdWFyZCxcbiAgICAgICk7XG4gICAgfSxcbiAgICByZXR1cm5zOiAocmV0dXJuR3VhcmQgPSBNLnVuZGVmaW5lZCgpKSA9PiB7XG4gICAgICAvKiogQHR5cGUge01ldGhvZEd1YXJkfSAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnLCB7XG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByZXN0QXJnR3VhcmQsXG4gICAgICAgIHJldHVybkd1YXJkLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9KTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pOyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZShJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDppbnRlcmZhY2VHdWFyZCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgSW50ZXJmYWNlR3VhcmR9XG4gKi8kaM2PX29uY2UuSW50ZXJmYWNlR3VhcmRTaGFwZShJbnRlcmZhY2VHdWFyZFNoYXBlKTtcbiAgICAgICBjb25zdCBhc3NlcnRJbnRlcmZhY2VHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBJbnRlcmZhY2VHdWFyZFNoYXBlLCAnaW50ZXJmYWNlR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEludGVyZmFjZUd1YXJkKGFzc2VydEludGVyZmFjZUd1YXJkKTtcbmhhcmRlbihhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPn0gW00gPSBSZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlcmZhY2VOYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZEd1YXJkc1xuICogQHBhcmFtIHt7IHNsb3BweT86IGJvb2xlYW4sIGRlZmF1bHRHdWFyZHM/OiBEZWZhdWx0R3VhcmRUeXBlIH19IFtvcHRpb25zXVxuICogQHJldHVybnMge0ludGVyZmFjZUd1YXJkPE0+fVxuICovXG5jb25zdCBtYWtlSW50ZXJmYWNlR3VhcmQgPSAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgeyBzbG9wcHkgPSBmYWxzZSwgZGVmYXVsdEd1YXJkcyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiB1bmRlZmluZWQgfSA9XG4gICAgb3B0aW9ucztcbiAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzdHJpbmcta2V5ZWQgbWV0aG9kIGd1YXJkcyBhcmUgcmVwcmVzZW50ZWQgaW4qL1xuICAvKiBhIENvcHlSZWNvcmQuIEJ1dCBzeW1ib2wta2V5ZWQgbWV0aG9kcyBjYW5ub3QgYmUsIHNvIHdlIHB1dCB0aG9zZSBpbiBhKi9cbiAgLyogQ29weU1hcCB3aGVuIHByZXNlbnQuKi9cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2RHdWFyZD59ICovXG4gIGNvbnN0IHN0cmluZ01ldGhvZEd1YXJkcyA9IHt9O1xuICAvKiogQHR5cGUge0FycmF5PFtzeW1ib2wsIE1ldGhvZEd1YXJkXT59ICovXG4gIGNvbnN0IHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhtZXRob2RHdWFyZHMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtZXRob2RHdWFyZHNbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChrZXkpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJpbmdNZXRob2RHdWFyZHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvKiogQHR5cGUge0ludGVyZmFjZUd1YXJkfSAqL1xuICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDppbnRlcmZhY2VHdWFyZCcsIHtcbiAgICBpbnRlcmZhY2VOYW1lLFxuICAgIG1ldGhvZEd1YXJkczogc3RyaW5nTWV0aG9kR3VhcmRzLFxuICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzLmxlbmd0aFxuICAgICAgPyB7IHN5bWJvbE1ldGhvZEd1YXJkczogbWFrZUNvcHlNYXAoc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcykgfVxuICAgICAgOiB7fSksXG4gICAgZGVmYXVsdEd1YXJkcyxcbiAgfSk7XG4gIGFzc2VydEludGVyZmFjZUd1YXJkKHJlc3VsdCk7XG4gIHJldHVybiAvKiogQHR5cGUge0ludGVyZmFjZUd1YXJkPE0+fSAqLyAocmVzdWx0KTtcbn07XG5cbmNvbnN0IEd1YXJkUGF5bG9hZFNoYXBlcyA9IGhhcmRlbih7XG4gICdndWFyZDphd2FpdEFyZ0d1YXJkJzogQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOnJhd0d1YXJkJzogUmF3R3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDptZXRob2RHdWFyZCc6IE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnOiBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxcbn0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdExpbWl0cyI6WyJkZWZhdWx0TGltaXRzIl0sImNoZWNrTWF0Y2hlcyI6WyJjaGVja01hdGNoZXMiXSwibWF0Y2hlcyI6WyJtYXRjaGVzIl0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiYXNzZXJ0UGF0dGVybiI6WyJhc3NlcnRQYXR0ZXJuIl0sImlzUGF0dGVybiI6WyJpc1BhdHRlcm4iXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciJdLCJNIjpbIk0iXSwia2luZE9mIjpbImtpbmRPZiJdLCJjb250YWluZXJIYXNTcGxpdCI6WyJjb250YWluZXJIYXNTcGxpdCJdLCJBd2FpdEFyZ0d1YXJkU2hhcGUiOlsiQXdhaXRBcmdHdWFyZFNoYXBlIl0sImlzQXdhaXRBcmdHdWFyZCI6WyJpc0F3YWl0QXJnR3VhcmQiXSwiYXNzZXJ0QXdhaXRBcmdHdWFyZCI6WyJhc3NlcnRBd2FpdEFyZ0d1YXJkIl0sIlJhd0d1YXJkU2hhcGUiOlsiUmF3R3VhcmRTaGFwZSJdLCJpc1Jhd0d1YXJkIjpbImlzUmF3R3VhcmQiXSwiYXNzZXJ0UmF3R3VhcmQiOlsiYXNzZXJ0UmF3R3VhcmQiXSwiU3luY1ZhbHVlR3VhcmRTaGFwZSI6WyJTeW5jVmFsdWVHdWFyZFNoYXBlIl0sIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIl0sIkFyZ0d1YXJkTGlzdFNoYXBlIjpbIkFyZ0d1YXJkTGlzdFNoYXBlIl0sIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIjpbIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIl0sIk1ldGhvZEd1YXJkU2hhcGUiOlsiTWV0aG9kR3VhcmRTaGFwZSJdLCJhc3NlcnRNZXRob2RHdWFyZCI6WyJhc3NlcnRNZXRob2RHdWFyZCJdLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSI6WyJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSJdLCJJbnRlcmZhY2VHdWFyZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkU2hhcGUiXSwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiOlsiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACwKxYbMJAACzCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVByb21pc2VLaXQoKSB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9ID0gbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xufVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIHtyZWFkb25seSB1bmtub3duW10gfCBbXX0gVFxuICogQHBhcmFtIHtUfSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+fSBBIG5ldyBQcm9taXNlLlxuICovXG4gICAgICAgZnVuY3Rpb24gcmFjZVByb21pc2VzKHZhbHVlcykge1xuICByZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSwgdmFsdWVzKSk7XG59XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA564QmQMDAAADAwAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbiAgICAgICBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKSA9PT0gbWF5YmVQcm9taXNlO1xufVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMdoTZ9EFgAARBYAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCBgaXNQcmltaXRpdmVgIHRoYXQncyBjdXJyZW50bHkgaW4gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICogTGF5ZXJpbmcgY29uc3RyYWludHMgbWFrZSB0aGlzIHRyaWNreSwgd2hpY2ggaXMgd2h5IHdlIGhhdmVuJ3QgeWV0IGZpZ3VyZWRcbiAqIG91dCBob3cgdG8gZG8gdGhpcy5cbiAqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzICh1bmRlZmluZWRcbiAqIHwgbnVsbFxuICogfCBib29sZWFuXG4gKiB8IG51bWJlclxuICogfCBiaWdpbnRcbiAqIHwgc3RyaW5nXG4gKiB8IHN5bWJvbCl9XG4gKi9cbmNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBJTVBPUlQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IHJlY29yZCA9PiB7XG4gIGlmICghcmVjb3JkIHx8IHJlY29yZC5zZXR0bGVkKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSByZWNvcmQ7XG4gIE9iamVjdC5hc3NpZ24ocmVjb3JkLCB7XG4gICAgZGVmZXJyZWRzOiB1bmRlZmluZWQsXG4gICAgc2V0dGxlZDogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5mcmVlemUocmVjb3JkKTtcbiAgcmV0dXJuIGRlZmVycmVkcztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbiAgICAvKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuICAgIC8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4gICAgLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG4gICAgcmV0dXJuIGhhcmRlbih7IHNldHRsZWQ6IHRydWUgfSk7XG4gIH1cblxuICBsZXQgcmVjb3JkID0ga25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG4gIGlmICghcmVjb3JkKSB7XG4gICAgcmVjb3JkID0geyBkZWZlcnJlZHM6IG5ldyBTZXQoKSwgc2V0dGxlZDogZmFsc2UgfTtcbiAgICBrbm93blByb21pc2VzLnNldCh2YWx1ZSwgcmVjb3JkKTtcbiAgICAvKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbiAgICAgIHZhbCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZXNvbHZlIH0gb2YgbWFya1NldHRsZWQocmVjb3JkKSkge1xuICAgICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVyciA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZWplY3QgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgeyByYWNlIH0gPSB7XG4gIC8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7cmVhZG9ubHkgdW5rbm93bltdIHwgW119IFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7VH0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUW251bWJlcl0+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiogQHR5cGUge1suLi5UXX0gKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGZpbGxlZCBieSB0aGUgbG9vcCovXG4gICAgY29uc3QgY2FjaGVkVmFsdWVzID0gW107XG4gICAgY29uc3QgQyA9IHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEMoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZGVmZXJyZWQgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICBjb25zdCB7IHNldHRsZWQsIGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuICAgICAgICAgIC8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuICAgIC8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbiAgICByZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpIHtcbiAgICAgICAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoZGVmZXJyZWRzKSB7XG4gICAgICAgICAgZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbn07JGjNj19vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAifqGgdCAAAHQgAADUAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxJTVBPUlQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG4gICAgICAgY29uc3QgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbiAgbGV0IGludGVybmFsUmVzb2x2ZTtcbiAgLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xuICBsZXQgaW50ZXJuYWxSZWplY3Q7XG5cbiAgLyoqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbiAgY29uc3QgcmVzb2x2ZSA9IHZhbHVlID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZXNvbHZlKSB7XG4gICAgICBpbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuICBjb25zdCByZWplY3QgPSByZWFzb24gPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlamVjdCkge1xuICAgICAgaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbiAgICAgIGludGVybmFsUmVzb2x2ZSA9IG51bGw7XG4gICAgICBpbnRlcm5hbFJlamVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChpbnRlcm5hbFJlamVjdCA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGV4ZWN1dG9yID0gKHJlcywgcmVqKSA9PiB7XG4gICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gdW5kZWZpbmVkICYmIGludGVybmFsUmVqZWN0ID09PSB1bmRlZmluZWQpO1xuICAgIGludGVybmFsUmVzb2x2ZSA9IHJlcztcbiAgICBpbnRlcm5hbFJlamVjdCA9IHJlajtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9KTtcbn07JGjNj19vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAs5nu6URwAAFEcAAAdAAAAQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVBpcGUiLCJtYWtlUXVldWUiLCJtYWtlU3RyZWFtIiwibWFwUmVhZGVyIiwibWFwV3JpdGVyIiwicHJpbWUiLCJwdW1wIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxtYWtlUHJvbWlzZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogVHlwZVNjcmlwdCBSZWFkT25seSBzZW1hbnRpY3MgYXJlIG5vdCBzdWZmaWNpZW50bHkgZXhwcmVzc2l2ZSB0byBkaXN0aW5ndWlzaCovXG4vKiBhIHZhbHVlIG9uZSBwcm9taXNlcyBub3QgdG8gYWx0ZXIgZnJvbSBhIHZhbHVlIG9uZSBtdXN0IG5vdCBhbHRlciwqL1xuLyogbWFraW5nIGl0IHVzZWxlc3MuKi9cbmNvbnN0IGZyZWV6ZSA9IC8qKiBAdHlwZSB7PFQ+KHY6IFQgfCBSZWFkb25seTxUPikgPT4gVH0gKi8gKE9iamVjdC5mcmVlemUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZSA9ICgpID0+IHtcbiAgbGV0IHsgcHJvbWlzZTogdGFpbFByb21pc2UsIHJlc29sdmU6IHRhaWxSZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICByZXR1cm4ge1xuICAgIHB1dCh2YWx1ZSkge1xuICAgICAgY29uc3QgeyByZXNvbHZlLCBwcm9taXNlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgdGFpbFJlc29sdmUoZnJlZXplKHsgdmFsdWUsIHByb21pc2UgfSkpO1xuICAgICAgdGFpbFJlc29sdmUgPSByZXNvbHZlO1xuICAgIH0sXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnZhbHVlKTtcbiAgICAgIHRhaWxQcm9taXNlID0gdGFpbFByb21pc2UudGhlbihuZXh0ID0+IG5leHQucHJvbWlzZSk7XG4gICAgICByZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuICAgIH0sXG4gIH07XG59OyRozY9fb25jZS5tYWtlUXVldWUobWFrZVF1ZXVlKTtcbmhhcmRlbihtYWtlUXVldWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jU3ByaW5nPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBhY2tzXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jU2luazxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBkYXRhXG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RyZWFtID0gKGFja3MsIGRhdGEpID0+IHtcbiAgY29uc3Qgc3RyZWFtID0gaGFyZGVuKHtcbiAgICAvKipcbiAqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZVxuICovXG4gICAgbmV4dCh2YWx1ZSkge1xuICAgICAgLyogTm90ZSB0aGUgc2hhbGxvdyBmcmVlemUgc2luY2UgdmFsdWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZnJlZXphYmxlKi9cbiAgICAgIC8qICh0eXBlZCBhcnJheXMgYXJlIG5vdCkuKi9cbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiBmYWxzZSB9KSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtUV3JpdGVSZXR1cm59IHZhbHVlXG4gKi9cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG4gICAgdGhyb3coZXJyb3IpIHtcbiAgICAgIGRhdGEucHV0KGhhcmRlbihQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59OyRozY9fb25jZS5tYWtlU3RyZWFtKG1ha2VTdHJlYW0pO1xuaGFyZGVuKG1ha2VTdHJlYW0pO1xuXG4vKiBKU0RvYyBUeXBlU2NyaXB0IHNlZW1zIHVuYWJsZSB0byBleHByZXNzIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbidzKi9cbi8qIGVudGFuZ2xlbWVudCBvZiBxdWV1ZXMsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpbiB0eXBlcy5kLnRzIHdvcmtzIGZvciB0aGUgZW5kKi9cbi8qIHVzZXIuKi9cbiAgICAgICBjb25zdCBtYWtlUGlwZSA9ICgpID0+IHtcbiAgY29uc3QgZGF0YSA9IG1ha2VRdWV1ZSgpO1xuICBjb25zdCBhY2tzID0gbWFrZVF1ZXVlKCk7XG4gIGNvbnN0IHJlYWRlciA9IG1ha2VTdHJlYW0oYWNrcywgZGF0YSk7XG4gIGNvbnN0IHdyaXRlciA9IG1ha2VTdHJlYW0oZGF0YSwgYWNrcyk7XG4gIHJldHVybiBoYXJkZW4oW3dyaXRlciwgcmVhZGVyXSk7XG59OyRozY9fb25jZS5tYWtlUGlwZShtYWtlUGlwZSk7XG5oYXJkZW4obWFrZVBpcGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0cmVhbTxUV3JpdGUsIFRSZWFkLCBUV3JpdGVSZXR1cm4sIFRSZWFkUmV0dXJuPn0gd3JpdGVyXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0cmVhbTxUUmVhZCwgVFdyaXRlLCBUUmVhZFJldHVybiwgVFdyaXRlUmV0dXJuPn0gcmVhZGVyXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbiAgICAgICBjb25zdCBwdW1wID0gYXN5bmMgKHdyaXRlciwgcmVhZGVyLCBwcmltZXIpID0+IHtcbiAgLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuICBjb25zdCB0aWNrID0gcHJvbWlzZSA9PlxuICAgIEUud2hlbihcbiAgICAgIHByb21pc2UsXG4gICAgICByZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qIEJlaG9sZDogbXV0dWFsIHJlY3Vyc2lvbi4qL1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgICAgcmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoLyoqIEB0eXBlIHtFcnJvcn0gKi8gZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIC8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuICBjb25zdCB0b2NrID0gcHJvbWlzZSA9PlxuICAgIEUud2hlbihcbiAgICAgIHByb21pc2UsXG4gICAgICByZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aWNrKHJlYWRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qKiBAdHlwZSB7RXJyb3J9ICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICBhd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTskaM2PX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmV0dXJuXG4gKiBAcGFyYW0ge0FzeW5jR2VuZXJhdG9yPFRSZWFkLCBUUmV0dXJuLCBUV3JpdGU+fSBnZW5lcmF0b3JcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuICAgICAgIGNvbnN0IHByaW1lID0gKGdlbmVyYXRvciwgcHJpbWVyKSA9PiB7XG4gIC8qIFdlIGNhcHR1cmUgdGhlIGZpcnN0IHJldHVybmVkIHByb21pc2UuKi9cbiAgY29uc3QgZmlyc3QgPSBnZW5lcmF0b3IubmV4dChwcmltZXIpO1xuICAvKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmV0dXJuPj19ICovXG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IHByaW1lZCA9IGhhcmRlbih7XG4gICAgLyoqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZSAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7VFJldHVybn0gdmFsdWUgKi9cbiAgICBhc3luYyByZXR1cm4odmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtFcnJvcn0gZXJyb3IgKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAamVzc2llLmpzL3NhZmUtYXdhaXQtc2VwYXJhdG9yKi9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHByaW1lZDtcbn07JGjNj19vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZGVyPFRJbj59IHJlYWRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZGVyPFRPdXQ+fVxuICovXG4gICAgICAgY29uc3QgbWFwUmVhZGVyID0gKHJlYWRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGFzeW5jIGZ1bmN0aW9uKiB0cmFuc2Zvcm1HZW5lcmF0b3IoKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiByZWFkZXIpIHtcbiAgICAgIHlpZWxkIHRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcik7XG4gIHJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xufTskaM2PX29uY2UubWFwUmVhZGVyKG1hcFJlYWRlcik7XG5oYXJkZW4obWFwUmVhZGVyKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VE91dD59IHdyaXRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuV3JpdGVyPFRJbj59XG4gKi9cbiAgICAgICBjb25zdCBtYXBXcml0ZXIgPSAod3JpdGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZWRXcml0ZXIgPSBoYXJkZW4oe1xuICAgIC8qKlxuICogQHBhcmFtIHtUSW59IHZhbHVlXG4gKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSB2YWx1ZVxuICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG59OyRozY9fb25jZS5tYXBXcml0ZXIobWFwV3JpdGVyKTtcbmhhcmRlbihtYXBXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADuW/a/0QEAANEBAAAcAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9yaW5nMC9tYWluLmpzXCIsIFtdXSxbXCIuL3JpbmcxL21haW4uanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9mAl5IEBAACBAQAAHwAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiQGVuZG8vZmFyIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADehziD9QMAAPUDAAAsAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jR2VuZXJhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXN5bmMgaXRlcmFibGUgdGhhdCBwcm9kdWNlcyBpdGVyYXRvciByZXN1bHRzIHZpYSBgbmV4dGAuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgU3ltYm9sLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFRSZXR1cm5cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4gfFxuICogICAgICAgICAgICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PlxuICogfSBuZXh0IHByb2R1Y2UgYSBzaW5nbGUtc3RlcCBpdGVyYXRvciByZXN1bHRcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgYXN5bmNHZW5lcmF0ZSA9IG5leHQgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4gaGFyZGVuKG5leHQoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0dlbmVyYXRlIjpbImFzeW5jR2VuZXJhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/nr5/fQBAAD0AQAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9tYWtlcnMuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwxmxeDMJAAAzCQAAJAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cbi8qIFRoZXNlIHdvcmsgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBuZXdgLiovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiIC8+Ki9cblxuLyoqXG4gKiBAdHlwZSB7PFQ+KGV4ZWN1dG9yOiAoXG4gKiAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCxcbiAqICAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkXG4gKiApID0+IHZvaWQpID0+IFByb21pc2U8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUHJvbWlzZSA9IGV4ZWN1dG9yID0+IGhhcmRlbihuZXcgUHJvbWlzZShleGVjdXRvcikpOyRozY9fb25jZS5tYWtlUHJvbWlzZShtYWtlUHJvbWlzZSk7XG5oYXJkZW4obWFrZVByb21pc2UpO1xuXG4vKiogQHR5cGVkZWYgezxLLCBWPihlbnRyaWVzPzogcmVhZG9ubHkgKHJlYWRvbmx5IFtLLCBWXSlbXSkgPT4gTWFwPEssIFY+fSBNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SywgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUl0ZXJhYmxlICovXG5cbi8qKiBAdHlwZSB7TWFwRnJvbUVudHJpZXMgJiBNYXBGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZU1hcCA9IGVudHJpZXNPckl0ZXJhYmxlID0+IGhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjNj19vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQ+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gU2V0PFQ+fSBTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFNldDxUPn0gU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1NldEZyb21WYWx1ZXMgJiBTZXRGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVNldCA9IHZhbHVlcyA9PiBoYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVNldChtYWtlU2V0KTtcbmhhcmRlbihtYWtlU2V0KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgViA9IGFueT4oXG4gKiAgICBlbnRyaWVzPzogcmVhZG9ubHkgW0ssIFZdW10gfCBudWxsXG4gKiApID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tRW50cmllc1xuICovXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxbSywgVl0+KSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtNYXBGcm9tRW50cmllcyAmIFdlYWtNYXBGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXAgPSBlbnRyaWVzID0+IGhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9PihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha1NldEZyb21WYWx1ZXMgJiBXZWFrU2V0RnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaVR4XlIFAABSBQAAKQAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsWyRozY9fYSA9PiAobWFrZVByb21pc2UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBSZXNvbHZlIHJldHVybmVkIHByb21pc2Ugd2l0aCB1bmRlZmluZWQgd2hlbiBgYm9keWAgcmV0dXJucyBmYWxzeS5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgYXdhaXRgIG5vdCBhdCB0aGUgZnVuY3Rpb24tbGV2ZWwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVCB8IFByb21pc2U8VD59IGJvZHkgcGVyZm9ybSBzaWRlLWVmZmVjdHMsIGFuZCByZXR1cm4gdHJ1dGh5IGlmXG4gKiB3ZSBzaG91bGQgcnVuIGFnYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzeW5jRG9XaGlsZSA9IGJvZHkgPT4ge1xuICByZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGxvb3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkb0NvbnRpbnVlID0gYXdhaXQgYm9keSgpO1xuICAgICAgaWYgKCFkb0NvbnRpbnVlKSB7XG4gICAgICAgIC8qIFJlc29sdmUgdGhlIG91dGVybW9zdCBwcm9taXNlLiovXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKiBEbyB0aGUgbG9vcCBhZ2Fpbi4gIFdlIGFyZSBjYXJlZnVsIG5vdCB0byBhd2FpdCBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhKi9cbiAgICAgIC8qIHByb21pc2UgY2hhaW4uKi9cbiAgICAgIGxvb3AoKS5jYXRjaChyZWplY3QpO1xuICAgIH07XG5cbiAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbaDcDlgEAAJYBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAWa1nOtDyAADQ8gAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAAAAAAAAAAAApIEC8wAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIHN9AAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAABMzBZHzCwAA8wsAACQAAAAAAAAAAAAAAKSBavYAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAAAVbrH6eQIAAHkCAAAlAAAAAAAAAAAAAACkgZ8CAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAC1M1ZEhAwAAIQMAACsAAAAAAAAAAAAAAKSBWwUBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaXMtcGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAbBWnPyIEAAAiBAAAJAAAAAAAAAAAAAAApIHFCAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzUEsBAh4DCgAAAAAAAAAAAKkbjar6DgAA+g4AACkAAAAAAAAAAAAAAKSBKQ0BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzUEsBAh4DCgAAAAAAAAAAAGC/2hirDQAAqw0AAC0AAAAAAAAAAAAAAKSBahwBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADhg52A5zwAAOc8AAAmAAAAAAAAAAAAAACkgWAqAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABf6b1eegUAAHoFAAAnAAAAAAAAAAAAAACkgYtnAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAQ7172XQGAAB0BgAAJwAAAAAAAAAAAAAApIFKbQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAPNfTQNNAgAATQIAACEAAAAAAAAAAAAAAKSBA3QBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABoPpBzxzwAAMc8AAAlAAAAAAAAAAAAAACkgY92AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAAFTn3CUTBgAAEwYAADoAAAAAAAAAAAAAAKSBmbMBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAWh3vSSYGAAAmBgAAOgAAAAAAAAAAAAAApIEEugEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAZ8y1+zwYAAM8GAAA2AAAAAAAAAAAAAACkgYLAAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAPdw1//0HAAD9BwAANgAAAAAAAAAAAAAApIGlxwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAADJyxEpYBQAAWAUAACMAAAAAAAAAAAAAAKSB9s8BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAANgnSHa+NgAAvjYAACkAAAAAAAAAAAAAAKSBj9UBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAD4gnomXHAAAlxwAACEAAAAAAAAAAAAAAKSBlAwCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAABg5KxbGQcAABkHAAAtAAAAAAAAAAAAAACkgWopAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAA5frfq0AtAABALQAAJgAAAAAAAAAAAAAApIHOMAIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIFSXgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN8l+OIpIAAAKSAAACsAAAAAAAAAAAAAAKSB718CAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb21taXR0ZWUuanNQSwECHgMKAAAAAAAAAAAAPLBEO1ESAABREgAAMQAAAAAAAAAAAAAApIFhgAIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2VsZWN0b3JhdGVUb29scy5qc1BLAQIeAwoAAAAAAAAAAAC3mGJdAxEAAAMRAAAqAAAAAAAAAAAAAACkgQGTAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanNQSwECHgMKAAAAAAAAAAAAm0DIbSxAAAAsQAAALAAAAAAAAAAAAAAApIFMpAIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAYrMHFVUMAABVDAAAKgAAAAAAAAAAAAAApIHC5AIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3ZvdGVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAAAAAAAAAAAAAKSBX/ECAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACjNk+m9QQAAPUEAAAoAAAAAAAAAAAAAACkgX0eAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAG0NeBXKDAAAygwAACUAAAAAAAAAAAAAAKSBuCMDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAjb2mAa4IAACuCAAAJAAAAAAAAAAAAAAApIHFMAMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzUEsBAh4DCgAAAAAAAAAAALGT1Y5eAwAAXgMAACUAAAAAAAAAAAAAAKSBtTkDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanNQSwECHgMKAAAAAAAAAAAAaBzsGv4EAAD+BAAAJAAAAAAAAAAAAAAApIFWPQMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKrVr42mJQAApiUAACcAAAAAAAAAAAAAAKSBlkIDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9qcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAi9VLVrAcAAKwHAAAoAAAAAAAAAAAAAACkgYFoAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzUEsBAh4DCgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAAAAAAAAAAAAAKSBc3ADAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAACNFcvqnAwAApwMAADcAAAAAAAAAAAAAAKSBFZ4DAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanNQSwECHgMKAAAAAAAAAAAApIPPnrEDAACxAwAAMAAAAAAAAAAAAAAApIERogMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzUEsBAh4DCgAAAAAAAAAAANZdM97lPAAA5TwAADYAAAAAAAAAAAAAAKSBEKYDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qc1BLAQIeAwoAAAAAAAAAAAAr7RBF8Q0AAPENAAArAAAAAAAAAAAAAACkgUnjAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAJD9IHigQgAAoEIAACYAAAAAAAAAAAAAAKSBg/EDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzUEsBAh4DCgAAAAAAAAAAAIq5WvK2DgAAtg4AACsAAAAAAAAAAAAAAKSBZzQEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanNQSwECHgMKAAAAAAAAAAAAT8Qll2pIAABqSAAAKAAAAAAAAAAAAAAApIFmQwQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADaiNsr1gMAANYDAAAlAAAAAAAAAAAAAACkgRaMBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdG1wRGlyLmpzUEsBAh4DCgAAAAAAAAAAAE5ip5ahBAAAoQQAACgAAAAAAAAAAAAAAKSBL5AEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlQ2hlY2suanNQSwECHgMKAAAAAAAAAAAAq3x1xKMFAACjBQAAKQAAAAAAAAAAAAAApIEWlQQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIEAmwQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANeHGT1wDAAAcAwAACoAAAAAAAAAAAAAAKSBoJwEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAAA/4UE8GRQAABkUAAAzAAAAAAAAAAAAAACkgVipBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAAAAAAAAAAAApIHCvQQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALNJ/07FGwAAxRsAACcAAAAAAAAAAAAAAKSB78UEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAbIRejM0IAADNCAAAqAAAAAAAAAAAAAACkgfnhBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAALEhEN6oMAACqDAAALgAAAAAAAAAAAAAApIF0JAUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAB65k5eJCYAACQmAAAnAAAAAAAAAAAAAACkgWoxBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAAZA69fPIpAADyKQAAKAAAAAAAAAAAAAAApIHTVwUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc1BLAQIeAwoAAAAAAAAAAABXqgSRKQ0AACkNAAApAAAAAAAAAAAAAACkgQuCBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAAB35kpGlQYAAJUGAAAkAAAAAAAAAAAAAACkgXuPBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIFSlgUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAEcacpNGDgAARg4AACEAAAAAAAAAAAAAAKSB8pcFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAP0kYu4gsAAOILAAAsAAAAAAAAAAAAAACkgXemBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAAAAAAAAAAACkgaOyBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAA16FBRuoYAADqGAAAMQAAAAAAAAAAAAAApIFeugUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAAAAAAAAAAACkgZfTBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAPk186ftFgAA7RYAADUAAAAAAAAAAAAAAKSB9+QFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJRapRtOEQAAThEAADUAAAAAAAAAAAAAAKSBN/wFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAKpX7y7bGgAA2xoAAC4AAAAAAAAAAAAAAKSB2A0GAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIH/KAYAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAO31mJswAgAAMAIAABwAAAAAAAAAAAAAAKSBnCoGAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtDNtlAolAAAKJQAAIwAAAAAAAAAAAAAApIEGLQYAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAANPYVxPMJAADzCQAAJQAAAAAAAAAAAAAApIFRUgYAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgYdcBgBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA2D1iULSwAAC0sAAAoAAAAAAAAAAAAAACkgSNeBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBlooGAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAAAAAAAAAAACkgY6TBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAARXv4GawIAACsCAAAJQAAAAAAAAAAAAAApIEVtwYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvbWFrZUhhbmRsZS5qc1BLAQIeAwoAAAAAAAAAAAAB0/RLSEsAAEhLAAAlAAAAAAAAAAAAAACkgQTABgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAAAAAAAAAAAAAKSBjwsHAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAACAMlLK2hMAANoTAAAiAAAAAAAAAAAAAACkgWENBwBAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAANY4VALFAQAAxQEAAB8AAAAAAAAAAAAAAKSBeyEHAEBlbmRvL2NhY2hlLW1hcC12MS4xLjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAgZXu/CYnAAAmJwAAJgAAAAAAAAAAAAAApIF9IwcAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9zcmMvY2FjaGVtYXAuanNQSwECHgMKAAAAAAAAAAAAb1Ehj2ELAABhCwAALAAAAAAAAAAAAAAApIHnSgcAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASPhCyt0FAADdBQAAKwAAAAAAAAAAAAAApIGSVgcAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAAC3lVPuJQgAACUIAAAlAAAAAAAAAAAAAACkgbhcBwBAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzUEsBAh4DCgAAAAAAAAAAAGGv/Gq4BAAAuAQAACcAAAAAAAAAAAAAAKSBIGUHAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc1BLAQIeAwoAAAAAAAAAAAAl7F33eQQAAHkEAAArAAAAAAAAAAAAAACkgR1qBwBAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAF02r3oGAwAABgMAACUAAAAAAAAAAAAAAKSB324HAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAduerGW8KAABvCgAAIgAAAAAAAAAAAAAApIEocgcAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAComiDaOwkAADsJAAAnAAAAAAAAAAAAAACkgdd8BwBAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAA2LNBgpkFAACZBQAAJQAAAAAAAAAAAAAApIFXhgcAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAAAAAAAAAAACkgTOMBwBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALwBM4I4FgAAOBYAACwAAAAAAAAAAAAAAKSBFY4HAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAGpmduJkDQAAZA0AAB0AAAAAAAAAAAAAAKSBl6QHAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAANPpRggQRwAAEEcAACMAAAAAAAAAAAAAAKSBNrIHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAAAAAAAAAAAAAKSBh/kHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAHOVMVJyFAAAchQAACcAAAAAAAAAAAAAAKSBJvsHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAACHeIi59BgAAPQYAAA1AAAAAAAAAAAAAACkgd0PCABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAAApE1XZ1gUAANYFAAApAAAAAAAAAAAAAACkgSQpCABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAAzKKSOVxIAAFcSAAAtAAAAAAAAAAAAAACkgUEvCABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAAAAAAAAAAAApIHjQQgAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAAAAAAAAAAAApIGIRAgAQGVuZG8vZXhvLXYxLjUuMTIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAsZMQ/xAgAAAQIAAAIwAAAAAAAAAAAAAApIEgRwgAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAFaP+6y5GAAAuRgAAIgAAAAAAAAAAAAAApIFxZwgAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAADJJdo2CwUAAAsFAAAmAAAAAAAAAAAAAACkgd+tCABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAeAAAAAAAAAAAAAACkgS6zCABAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAAAAAAAAAAAApIHCtAgAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAAAAAAAAAAAApIFYtggAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAAAAAAAAAAAAAKSBLLkIAEBlbmRvL21hcnNoYWwtdjEuOC4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGC/aqjJfQAAyX0AACoAAAAAAAAAAAAAAKSBbsEIAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADVwnO6F0QAABdEAAArAAAAAAAAAAAAAACkgX8/CQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAA1TX470RQAA9EUAAC0AAAAAAAAAAAAAAKSB34MJAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAABCdBXpvkIAAL5CAAAqAAAAAAAAAAAAAACkgR7KCQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAq3GB+KEJAAChCQAALQAAAAAAAAAAAAAApIEkDQoAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAGVYhbV8PwAAfD8AACMAAAAAAAAAAAAAAKSBEBcKAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAIGivjHoWQAA6FkAACUAAAAAAAAAAAAAAKSBzVYKAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIH4sAoAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAOMQ3SNJDAAASQwAAB0AAAAAAAAAAAAAAKSBj7IKAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAAAAAAAAAAAAAKSBE78KAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAE6FbiMVDQAAFQ0AACgAAAAAAAAAAAAAAKSBh8oKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9ieXRlQXJyYXkuanNQSwECHgMKAAAAAAAAAAAAmae90ggIAAAICAAAKAAAAAAAAAAAAAAApIHi1woAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAABHL7odZwsAAGcLAAApAAAAAAAAAAAAAACkgTDgCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAACeOsLT2BkAANgZAAAuAAAAAAAAAAAAAACkgd7rCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAGrLJkbNHQAAzR0AACQAAAAAAAAAAAAAAKSBAgYLAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAAB7Bop6fAkAAHwJAAArAAAAAAAAAAAAAACkgREkCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAKEnjMn0JQAA9CUAACcAAAAAAAAAAAAAAKSB1i0LAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAACcUmBpgwUAAIMFAAApAAAAAAAAAAAAAACkgQ9UCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB8Jer96iEAAOohAAAwAAAAAAAAAAAAAACkgdlZCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAJgKOt2I/AABiPwAAKgAAAAAAAAAAAAAApIERfAsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAPucn7IwLgAAMC4AACgAAAAAAAAAAAAAAKSBu7sLAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAh4APKFIWAABSFgAAKwAAAAAAAAAAAAAApIEx6gsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAD8qNkH2w8AANsPAAAlAAAAAAAAAAAAAACkgcwADABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3RyaW5nLmpzUEsBAh4DCgAAAAAAAAAAAAL3NCLDFAAAwxQAACUAAAAAAAAAAAAAAKSB6hAMAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAXLhQ2WQJAABkCQAAJQAAAAAAAAAAAAAApIHwJQwAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAC3XT1cJhYAACYWAAApAAAAAAAAAAAAAACkgZcvDABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAAAAAAAAAAACkgQRGDABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAAAAAAAAAAAApIGeRwwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKohA+kLSAAAC0gAACoAAAAAAAAAAAAAAKSByVYMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAD/2yuQPygAAD8oAAAtAAAAAAAAAAAAAACkgRyfDABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAANFtTY00VAABNFQAAKQAAAAAAAAAAAAAApIGmxwwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAALCODJiwRAAAsEQAAKQAAAAAAAAAAAAAApIE63QwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAA2zWaQMMiAADDIgAAOQAAAAAAAAAAAAAApIGt7gwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAJnEOAFXKAAAVygAADUAAAAAAAAAAAAAAKSBxxENAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAHQfjxllLwAAZS8AADUAAAAAAAAAAAAAAKSBcToNAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAF0aWkIrLwAAKy8AADYAAAAAAAAAAAAAAKSBKWoNAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1BLAQIeAwoAAAAAAAAAAABmpO57vjIBAL4yAQA1AAAAAAAAAAAAAACkgaiZDQBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAAAAAAAAAAACkgbnMDgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAAsCsWGzCQAAswkAACIAAAAAAAAAAAAAAKSBUc4OAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA564QmQMDAAADAwAAKwAAAAAAAAAAAAAApIFE2A4AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADHaE2fRBYAAEQWAAAqAAAAAAAAAAAAAACkgZDbDgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAACJ+oaB0IAAAdCAAANQAAAAAAAAAAAAAApIEc8g4AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIGM+g4AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAALOZ7ulEcAABRHAAAHQAAAAAAAAAAAAAApIEo/A4AQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAAAAAAAAAAAApIG0GA8AamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAAAAAAAAAAACkgb8aDwBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAN6HOIP1AwAA9QMAACwAAAAAAAAAAAAAAKSBfRwPAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAP56+f30AQAA9AEAACIAAAAAAAAAAAAAAKSBvCAPAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAAwxmxeDMJAAAzCQAAJAAAAAAAAAAAAAAApIHwIg8AamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGlUeF5SBQAAUgUAACkAAAAAAAAAAAAAAKSBZSwPAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAAAAAAAAAAAAAKSB/jEPAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAKAAoADWNQAA1DMPAAAA","endoZipBase64Sha512":"1e74aa17873995ac53245ed415c0e25e5b3a45fc302ccb2a8acf982d0d0ae9ced982fb6ca0137101ac0fc6708d7c1fbab81020bb0333caf89d18da36d8e2069e"};
|